密码验证合格程序
条件一: 长度大于8 -- 直接调用字符串长度的方法验证;
条件二: 必须包含大小写数字和其它字符中的至少三种 -- 新建一个长度为4的数组进行存储, 如果有字符符合条件就将对应位置的元素设置为1, 求和即使种类数;
条件三: 不能有重复的长度至少为3的字串 -- 依次检查
验证条件三的算法复杂度为O(nlogn) 可能不是最优解
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = "";
while ((s = br.readLine()) != null) {
if (verify(s)) {
System.out.println("OK");
} else {
System.out.println("NG");
}
}
br.close();
}
public static boolean verify(String s) {
// 检查密码长度
if (s.length() <= 8) {
return false;
}
// 检查密码字符种类
char[] cs = s.toCharArray();
int[] checkChar = new int[4];
for (char c: cs) {
if ('a' <= c && c <= 'z') {
checkChar[0] = 1;
} else if ('A' <= c && c <= 'Z') {
checkChar[1] = 1;
} else if ('0' <= c && c <= '9') {
checkChar[2] = 1;
} else {
checkChar[3] = 1;
}
}
int coun = 0;
for(int n: checkChar) {
coun += n;
}
if (coun < 3) {
return false;
}
// 检查重复子串
int slow = 0, fast = 0;
while (slow < cs.length - 5) {
fast = slow + 3;
while (fast < cs.length - 2 && cs[fast] != cs[slow]) {
fast++;
}
if (fast != cs.length - 2) {
boolean check2 = cs[slow+1] == cs[fast+1];
boolean check3 = cs[slow+2] == cs[fast+2];
if (check2 && check3) {
return false;
}
}
slow++;
}
return true;
}
}
京公网安备 11010502036488号