牛客算法题——密码验证合格程序

题目描述:

密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有长度大于2的包含公共元素的子串重复 (注:其他符号不含空格或换行)
数据范围:输入的字符串长度满足 1 \le n \le 100 \1≤n≤100
输入描述
一组字符串。
输出描述
如果符合要求输出:OK,否则输出NG
示例1
输入:
021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
复制
输出:
OK
NG
NG
OK

这是今天刷到的一道算法题,我自己写的程序比较繁琐,并且使用的比较传统暴力的解法,看题解的时候看见了一个大佬的程序:

const list = []
let itm;
while(itm=readline()){
    
    
    list.push(itm)
}

for(let itm of list){
    
    
    if(!(/.{9,}/.test(itm))){
    
    
        console.log('NG');
        continue;
    }
    let sum = 0;
    if(/[a-z]/.test(itm))sum++
    if(/[A-Z]/.test(itm))sum++
    if(/[\d]/.test(itm))sum++
    if(/[^\da-zA-Z]/.test(itm))sum++
    
    if(sum<3){
    
    
        console.log('NG');
        continue;
    }
    //正则表达式用的很巧妙!
    if(/(.{3,}).*\1/g.test(itm)){
    
    
        console.log('NG');
    }else {
    
    
        console.log('OK');
    }
    
}

/(.{3,}).*\1/g 这个正则表达式用的特别好:
(.{3,}) 表示匹配并捕获一个含三个以上任意字符(除换行符)的元组
.* 匹配任意字符0次以上 ,
\1 重复匹配捕获的第一个元组
我自己做这个题在这个部分没有想到用正则,更没想到可以用这么巧妙的正则表达式,原本还算比较复杂的问题简化了很多,学到了~~

猜你喜欢

转载自blog.csdn.net/weixin_43183219/article/details/126484930
今日推荐