密码验证合格程序
条件一: 长度大于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; } }