这种题目从最开始我就想着要用正则表达式去判断。但是一直受困于一个正则表达式如何解释这个规则。

后来在别人的题解里看到了一种解法,就是将这些规则分到不同的正则表达式里,然后计算。我觉得这个思路不错,按照这个思路我写了一段代码:

package huawei;

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String a = in.nextLine();
            if (a.length() <= 8) {
                System.out.println("NG");
                continue;
            }
            if (!checkReg(a)) {
                System.out.println("NG");
                continue;
            }
            if (checkDup(a, 0, 3)) {
                System.out.println("NG");
            }
            else {
                System.out.println("OK");
            }
        }
    }

    private static boolean checkDup(String s, int l, int r) {
        if (r > s.length() - 1) {
            return false;
        }
        if (s.substring(r).contains(s.substring(l, r))) {
            return true;
        } else {
            return checkDup(s, l+1, r+1);
        }
    }

    private static boolean checkReg(String s) {
        int cnt = 0;

        Pattern pattern1 = Pattern.compile("[A-Z]");
        Matcher matcher1 = pattern1.matcher(s);
        if (matcher1.find()) {
            cnt += 1;
        }

        Pattern pattern2 = Pattern.compile("[a-z]");
        Matcher matcher2 = pattern2.matcher(s);
        if (matcher2.find()) {
            cnt += 1;
        }

        Pattern pattern3 = Pattern.compile("[0-9]");
        Matcher matcher3 = pattern3.matcher(s);
        if (matcher3.find()) {
            cnt += 1;
        }

        Pattern pattern4 = Pattern.compile("[^0-9a-zA-Z]");
        Matcher matcher4 = pattern4.matcher(s);
        if (matcher4.find()) {
            cnt += 1;
        }

        return cnt >= 3;
    }

}