, ,

HJ20.密码验证合格程序

描述 你需要书写一个程序验证给定的密码是否合格。 合格的密码要求:∙ ∙长度不少于 88 …

描述

你需要书写一个程序验证给定的密码是否合格。

合格的密码要求:
∙长度不少于 88 位
∙必须包含大写字母、小写字母、数字、特殊字符中的至少三种
∙不能分割出两个独立的、长度大于 22 的连续子串,使得这两个子串完全相同;更具体地,如果存在两个长度大于 22 的独立子串 s1,s2s1​,s2​ ,使得 s1=s2s1​=s2​ ,那么密码不合法。

子串为从原字符串中,连续的选择一段字符(可以全选、可以不选)得到的新字符串。

可见字符集为 ASCII 码在 3333 到 126126 范围内的可见字符。您可以参阅下表获得其详细信息(您可能关注的内容是,这其中不包含空格、换行)。

../图片/AllAscii.png

输入描述:

本题将会给出 1T101≦T≦10 组测试数据,确切数字未知,您需要一直读入直到文件结尾;您也可以参考 牛客网在线判题系统使用帮助 获得更多的使用帮助。每组测试数据描述如下:

在一行上输入一个长度为 1length(s)1001≦length(s)≦100 ,由可见字符构成的字符串 ss ,代表待判断的密码。

输出描述:

对于每一组测试数据,新起一行。若密码合格,输出 OKOK ,否则输出 NGNG 。

示例1

输入:

021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
021Abc1111

输出:

OK
NG
NG
OK
OK

说明:

对于第二组测试数据,"Abc9Abc1""Abc9Abc1" 中存在两个长度大于 22 的独立子串 "Abc""Abc" ,即橙色标记部分。
对于第三组测试数据,仅包含大写字母和数字,不满足条件。

示例2

输入:

Abc1@
A1@ababa@1A

输出:

NG
OK

说明:

对于第一组测试数据,长度不足 88 位,不满足条件。
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;
}

Previous Post

Next Post

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

About the Author

每个人都有自己得时区,在自己得时区里,一切都是准时的。

BlockSpare — News, Magazine and Blog Addons for (Gutenberg) Block Editor