这种题目从最开始我就想着要用正则表达式去判断。但是一直受困于一个正则表达式如何解释这个规则。
后来在别人的题解里看到了一种解法,就是将这些规则分到不同的正则表达式里,然后计算。我觉得这个思路不错,按照这个思路我写了一段代码:
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;
}
}