题解

根据题意需要满足三大类情况:

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.hasNextLine()) {
            String str = sc.nextLine();
            // 1.长度超过8位
            if (str.length() < 8) {
                System.out.println("NG");
                break;
            }

            // 2.包括大小写字母.数字.其它符号,以上四种至少三种
            String[] regexs = {".*[A-Z].*", ".*[a-z].*", ".*[0-9].*", ".*[^A-Za-z0-9\\s\\n].*"};
            int count = 0;
            for (int i = 0; i < regexs.length; i++) {
                if (str.matches(regexs[i])) {
                    count++;
                }
            }
            if (count < 3) {
                System.out.println("NG");
                break;
            }

            // 3.不能有长度大于2的包含公共元素的子串重复
            boolean flag = false;
            for (int i = 1; i < str.length() - 2; i++) {
                String s = str.substring(i - 1, i + 2);
                String s1 = str.substring(0, i);
                String s2 = str.substring(i + 2);
                if (s1.indexOf(s) != -1) { // 存在相同字符串
                    flag = true;
                    break;
                }
                if (s2.indexOf(s) != -1) { // 存在相同字符串
                    flag = true;
                    break;
                }
            }
            if (flag) {
                System.out.println("NG");
                break;
            }

            // 4.打印结果
            System.out.println("OK");
        }
    }
}