华为oj之密码验证合格程序
2015-06-09 14:43
295 查看
密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有相同长度超2的子串重复
判断字符类型时采用位标记,判断重复子串时使用动态规划
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有相同长度超2的子串重复
判断字符类型时采用位标记,判断重复子串时使用动态规划
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); while(sc.hasNext()) { String pwd=sc.nextLine(); if(isok(pwd)) { System.out.println("OK"); } else { System.out.println("NG"); } } sc.close(); } public static boolean isok(String pwd) { boolean result=false; if(pwd.length()>8)//长度要求大于8 { //用一个int型来表示四种类型是否存在,一个用一位 int flag=0; //遍历标记类型 for(int i=0;i<pwd.length();i++) { char tmp=pwd.charAt(i); if(tmp>='a'&&tmp<='z') { flag=flag|8; } else if(tmp>='A'&&tmp<='Z') { flag=flag|4; } else if(tmp>='0'&&tmp<='9') { flag=flag|2; } else { flag=flag|1; } } if((flag&15)==15||(flag&15)==7||(flag&15)==11||(flag&15)==13||(flag&15)==14)//至少存在三种不同类型字符 { if(maxSame(pwd)<=2)//不存在长度大于2的相同子串 { result=true; } } } return result; } //用动态规划的方法来求字符串中最长的相同子串长度 public static int maxSame(String str) { int[][] max=new int[str.length()][str.length()];//声明存储空间,只用一个下三角就可以了,代表从i开始与从j开始的子串与多长相同 int maxlen=0; //处理初始值 for(int i=0;i<str.length()-1;i++) { if(str.charAt(i)==str.charAt(str.length()-1)) { max[i][str.length()-1]=1; maxlen=1; } } //递推关系为,若str.charAt(i)==str.charAt(j)则max[i][j]=max[i+1][j+1]+1,否则max[i][j]=0 for(int j=str.length()-2;j>0;j--)//从下向上从右向左遍历下三角 { for(int i=j-1;i>=0;i--) { if(str.charAt(i)==str.charAt(j)) { max[i][j]=max[i+1][j+1]+1; //更新最长相同长度 if(max[i][j]>maxlen) { maxlen=max[i][j]; } } else { max[i][j]=0; } } } return maxlen; } }
相关文章推荐
- object-c(oc)内存管理机制详解
- revit二次开发 获取水管的坐标
- 关系型数据库基本概念及MySQL简述
- jquery 事件处理handler函数的参数
- hdu 1718 Rank
- CocoaPods遇到的问题
- 产品经理经常犯的十大顶级错误
- js一个抽奖的例子
- http 304
- GMAT最新题型介绍及真题讲解
- 点投网的安全性分析
- Java泛型 通配符的限定
- 据说一半以上的java程序员会出错的题
- linux下安装jboss6+jdk1.7
- Protected和private访问权限
- vnc viewer for linux
- 凸优化问题
- uC/os-ii在MDK下使用心得
- Linux中的AIO(异步I/O asynchronous I/O )
- 【转】理解 Android Build 系统----不错