题解 | #密码验证合格程序#
密码验证合格程序
https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841
关键是第三点:不能有长度大于2的包含公共元素的子串重复
那就要检查3字符的子串,是否有重复的
子串,以第一个字母开头的子串包含了以第二个字母开头的子串。
怎么一个for循环就可以获取子串吗? 至少得一个for获取子串起始位置,一个for获取子串结束位置吧。
其实我们只需要判断,以第一个字母为开始的子串就可以,所以一个for循环获取子串的终止位置就行了。
import java.util.HashSet; import java.util.Scanner; import java.util.Set; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNextLine()) { // 注意 while 处理多个 case String str = in.nextLine(); checkPwd(str); } } public static void checkPwd(String str) { if (str.length() <= 8) { System.out.println("NG"); return; } int upperLetter = 0; int lowLetter = 0; int num = 0; int other = 0; for (int i = 0; i < str.length(); i++) { char ch = str.charAt(i); if (Character.isUpperCase(ch)) { upperLetter = 1; } else if (Character.isLowerCase(ch)) { lowLetter = 1; } else if (Character.isDigit(ch)) { num = 1; } else { other = 1; } } int sum = upperLetter + lowLetter + num + other; if (sum < 3) { System.out.println("NG"); return; } //不能有长度大于2的包含公共元素的子串重复 //借助字典减少暴力搜索时间 //检查3字符的字串,是否有重复的 //021Abc9Abc1 Set<String> set = new HashSet<>(); for (int i = 0; i < str.length() - 2; i++) { //substring,左闭右开 String substr = str.substring(i, i + 3); if (!set.contains(substr)) { set.add(substr); } else { System.out.println("NG"); return; } } System.out.println("OK"); } }#在找工作求抱抱##我的2023新年愿望#