这道题难点是如何找到子串, 用递归, 只需要证明3个字符的子串有没重复即可, 因为即使4个字符子串重复, 3字符子串也会重复.
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
String ok = "OK";
String ng = "NG";
while (in.hasNextLine()) { // 注意 while 处理多个 case
String a = in.nextLine();
if (a.length() <= 8) {
System.out.println(ng);
continue;
}
int[] bingo = new int[] {0, 0, 0, 0};
for (int i = 0; i < a.length(); i++) {
char c = a.charAt(i);
if (c == ' ' || c == '\n') {
System.out.println(ng);
continue;
}
if (Character.isDigit(c)) {
bingo[0] = 1;
} else if (Character.isUpperCase(c)) {
bingo[1] = 1;
} else if (Character.isLowerCase(c)) {
bingo[2] = 1;
} else {
bingo[3] = 1;
}
}
int c = 0;
for (int i = 0; i < bingo.length; i++) {
c += bingo[i];
}
if (c < 3) {
System.out.println(ng);
continue;
}
boolean isOk = true;
if (!isRepeat(a, 0, 3)) {
System.out.println(ok);
} else {
System.out.println(ng);
}
}
}
public static boolean isRepeat(String mStr, int start, int end) {
//如果end大于等于length 就结束,因为没有没子串了, 还没找到重复证明就没重复,直接return false
if (end >= mStr.length()) {
//没有重复
return false;
}
// end 后面的子串,如果包含前面这段子串,则表示重复了 ,
if (mStr.substring(end).contains(mStr.substring(start, end))) {
return true;
}
//继续递归找下一串, 下标start与end 各右移一位
return isRepeat(mStr, start + 1, end + 1);
}
}

京公网安备 11010502036488号