密码验证合格程序

条件一: 长度大于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;
    }    
}