描述
你需要书写一个程序验证给定的密码是否合格。
合格的密码要求:
∙长度不少于 8 位
∙必须包含大写字母、小写字母、数字、特殊字符中的至少三种
∙不能分割出两个独立的、长度大于 2 的连续子串,使得这两个子串完全相同;更具体地,如果存在两个长度大于 2 的独立子串 s1,s2 ,使得 s1=s2 ,那么密码不合法。
子串为从原字符串中,连续的选择一段字符(可以全选、可以不选)得到的新字符串。
可见字符集为 ASCII 码在 33 到 126 范围内的可见字符。您可以参阅下表获得其详细信息(您可能关注的内容是,这其中不包含空格、换行)。
输入描述:
本题将会给出 1≦T≦10 组测试数据,确切数字未知,您需要一直读入直到文件结尾;您也可以参考 牛客网在线判题系统使用帮助 获得更多的使用帮助。每组测试数据描述如下:
在一行上输入一个长度为 1≦length(s)≦100 ,由可见字符构成的字符串 s ,代表待判断的密码。
输出描述:
对于每一组测试数据,新起一行。若密码合格,输出 OK ,否则输出 NG 。
示例1
输入:
021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
021Abc1111
输出:
OK
NG
NG
OK
OK
说明:
对于第二组测试数据,"Abc9Abc1" 中存在两个长度大于 2 的独立子串 "Abc" ,即橙色标记部分。
对于第三组测试数据,仅包含大写字母和数字,不满足条件。
示例2
输入:
Abc1@
A1@ababa@1A
输出:
NG
OK
说明:
对于第一组测试数据,长度不足 8 位,不满足条件。
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
const childStr = (str)=>{
let map = new Map();
for(let i=0;i<str.length;i++){
const temp = str.substring(i,i+3);
if(map.has(temp)){
const lastIndex = map.get(temp);
if(i>=lastIndex +3){
return true;
}
}else{
map.set(temp,i)
}
}
return false;
}
const check=(str)=>{
if(str.length<8){
return false;
}
let num = 0;
if(/[A-Z]+/.test(str)){
num++;
}
if(/[a-z]+/.test(str)){
num++;
}
if(/\d+/.test(str)){
num++;
}
if(/[^A-Za-z0-9]/.test(str)){
num++;
}
if(num<3){
//console.log(str,'lte 3');
return false;
}
if(childStr(str)){
//console.log(str,'childStr');
return false;
}
return true;
}
void async function () {
// Write your code here
while(line = await readline()){
let tokens = line.trim();
if(check(tokens)){
console.log('OK');
}else{
console.log('NG');
}
}
}()
重点子串检查方式
const childStr = (str)=>{
let map = new Map();
for(let i=0;i<str.length;i++){
const temp = str.substring(i,i+3);
if(map.has(temp)){
const lastIndex = map.get(temp);
if(i>=lastIndex +3){
return true;
}
}else{
map.set(temp,i)
}
}
return false;
}




