** * 条件3的代码是自己一步一步根据调试结果改出来的,案例全部通过自己都有点懵!!**

第一层for循环:重复子串的长度可能为3、4、5。。。但不会超过字符总长度的一半

第二、三层for循环:有点类似于滑动窗口

import java.util.HashSet;
import java.util.Scanner;

/**
 * 【密码验证合格程序】
 *
 *  描述:
 *      密码要求:
 *      1.长度超过8位
 *      2.包括大小写字母.数字.其它符号,以上四种至少三种
 *      3.不能有长度大于2的包含公共元素的子串重复 (注:其他符号不含空格或换行)
 *
 *   A-Z的ascii值为 65-90    a-z的ascii值为 97-122
 *
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        for (String nextLine = null; sc.hasNext();) {
            nextLine = sc.nextLine();
            if (checkCorrect(nextLine)) {
                System.out.println("OK");
            } else {
                System.out.println("NG");
            }
        }
    }

    /**
     * 密码校验方法
     *
     * @param input
     * @return
     */
    public static boolean checkCorrect(String input) {
      	// 是否满足条件1
        if (input.length() < 8) {
            return false;
        }
		// 是否满足条件2
        HashSet<Integer> hashSet = new HashSet<>();
        char[] chars = input.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            // 包含大写字母
            if (('A' <= chars[i]) && (chars[i] <= 'Z')) {
                hashSet.add(1);  // 具体添加什么不重要,标识而已
            }
            // 包含小写字母
            else if (('a' <= chars[i]) && (chars[i] <= 'z')) {
                hashSet.add(2);
            }
            // 包含数字
            else if (('0' <= chars[i]) && (chars[i] <= '9')) {
                hashSet.add(3);
            }
            // 包含其他字符
            else {
                hashSet.add(4);
            }
        }
        if (hashSet.size() < 3) {
            return false;
        }
		// 是否满足条件3
        int size = chars.length / 2;
        size = chars.length % 2 == 0? size : size + 1; // 基数则加1

        StringBuilder sb = new StringBuilder(input);
        for (int i = 3; i <= size; i++) {
            for (int k = 0; k < chars.length - i; k++) {
                String temp = sb.substring(k, k + i);
                for (int j = k + i; j <= chars.length - i; j++) {
                    String substring = sb.substring(j, j + i);
                    if (temp.equals(substring)) {
                        return false;
                    }
                }
            }
        }
      	// 全部满足
        return true;
    }
}