题目描述:
密码要求:
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 重复匹配捕获的第一个元组
我自己做这个题在这个部分没有想到用正则,更没想到可以用这么巧妙的正则表达式,原本还算比较复杂的问题简化了很多,学到了~~