题解 | #密码验证合格程序#

密码验证合格程序

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);
    }
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务