这道题难点是如何找到子串, 用递归, 只需要证明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); } }