题解 | #密码验证合格程序#
密码验证合格程序
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); } }