题解
根据题意需要满足三大类情况:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
解答:通过正则去找到匹配得上的类型是否大于三种。
3.不能有长度大于2的包含公共元素的子串重复
解答:依次截取三个字符形成新的字符串,然后根据当前的位置,查找左侧和右侧是否有重复。
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
String str = sc.nextLine();
// 1.长度超过8位
if (str.length() < 8) {
System.out.println("NG");
break;
}
// 2.包括大小写字母.数字.其它符号,以上四种至少三种
String[] regexs = {".*[A-Z].*", ".*[a-z].*", ".*[0-9].*", ".*[^A-Za-z0-9\\s\\n].*"};
int count = 0;
for (int i = 0; i < regexs.length; i++) {
if (str.matches(regexs[i])) {
count++;
}
}
if (count < 3) {
System.out.println("NG");
break;
}
// 3.不能有长度大于2的包含公共元素的子串重复
boolean flag = false;
for (int i = 1; i < str.length() - 2; i++) {
String s = str.substring(i - 1, i + 2);
String s1 = str.substring(0, i);
String s2 = str.substring(i + 2);
if (s1.indexOf(s) != -1) { // 存在相同字符串
flag = true;
break;
}
if (s2.indexOf(s) != -1) { // 存在相同字符串
flag = true;
break;
}
}
if (flag) {
System.out.println("NG");
break;
}
// 4.打印结果
System.out.println("OK");
}
}
}