** * 条件3的代码是自己一步一步根据调试结果改出来的,案例全部通过自己都有点懵!!**
第一层for循环:重复子串的长度可能为3、4、5。。。但不会超过字符总长度的一半
第二、三层for循环:有点类似于滑动窗口
import java.util.HashSet;
import java.util.Scanner;
/**
* 【密码验证合格程序】
*
* 描述:
* 密码要求:
* 1.长度超过8位
* 2.包括大小写字母.数字.其它符号,以上四种至少三种
* 3.不能有长度大于2的包含公共元素的子串重复 (注:其他符号不含空格或换行)
*
* A-Z的ascii值为 65-90 a-z的ascii值为 97-122
*
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for (String nextLine = null; sc.hasNext();) {
nextLine = sc.nextLine();
if (checkCorrect(nextLine)) {
System.out.println("OK");
} else {
System.out.println("NG");
}
}
}
/**
* 密码校验方法
*
* @param input
* @return
*/
public static boolean checkCorrect(String input) {
// 是否满足条件1
if (input.length() < 8) {
return false;
}
// 是否满足条件2
HashSet<Integer> hashSet = new HashSet<>();
char[] chars = input.toCharArray();
for (int i = 0; i < chars.length; i++) {
// 包含大写字母
if (('A' <= chars[i]) && (chars[i] <= 'Z')) {
hashSet.add(1); // 具体添加什么不重要,标识而已
}
// 包含小写字母
else if (('a' <= chars[i]) && (chars[i] <= 'z')) {
hashSet.add(2);
}
// 包含数字
else if (('0' <= chars[i]) && (chars[i] <= '9')) {
hashSet.add(3);
}
// 包含其他字符
else {
hashSet.add(4);
}
}
if (hashSet.size() < 3) {
return false;
}
// 是否满足条件3
int size = chars.length / 2;
size = chars.length % 2 == 0? size : size + 1; // 基数则加1
StringBuilder sb = new StringBuilder(input);
for (int i = 3; i <= size; i++) {
for (int k = 0; k < chars.length - i; k++) {
String temp = sb.substring(k, k + i);
for (int j = k + i; j <= chars.length - i; j++) {
String substring = sb.substring(j, j + i);
if (temp.equals(substring)) {
return false;
}
}
}
}
// 全部满足
return true;
}
}