题解 | #密码验证合格程序#
密码验证合格程序
https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextLine()) {
String s = in.nextLine();
// 长度需超过8
if (s.length() < 9) {
System.out.println("NG");
continue;
}
// 包括大小写字母.数字.其它符号,以上四种至少三种
int kind = 0;
if (s.matches(".*[A-Z].*")) kind++; // 匹配大写字母
if (s.matches(".*[a-z].*")) kind++; // 匹配小写字母
if (s.matches(".*[0-9].*")) kind++; // 匹配数组
if (s.matches(".*[^A-Za-z0-9].*")) kind++; //匹配其他符号
if (kind < 3) { //如果字符种类小于3,则不合格
System.out.println("NG");
continue;
}
// 不能有长度大于2的包含公共元素的子串重复
// 从s.substring(0,3)开始,判断剩余部分是否包含这部分子串
if(containsRepeated3(s,0,3)){
System.out.println("NG");
}else{
System.out.println("OK");
}
}
}
// 判断是否有长度大于2的重复子串
// 其实只需要判断是否有长度为3的公共子串
// 因为长度如果有长度为4的重复子串,那么一定有长度为3的重复子串,以此类推...
public static boolean containsRepeated3(String s, int l, int r){
if(r >= s.length()){
return false;
}
// 判断右边的子串是否包含左边长度为3的字串,如果包含,返回true
if(s.substring(r).contains(s.substring(l,r))){
return true;
}
// 如果右边的子串不包含左边子串,则向右移动一个单位
return containsRepeated3(s, l+1, r+1);
}
}
阿里云工作强度 710人发布
