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

152 阅读2分钟

HJ20 密码验证合格程序

描述

密码要求:

1.长度超过8位

2.包括大小写字母.数字.其它符号,以上四种至少三种

3.不能有长度大于2的包含公共元素的子串重复 (注:其他符号不含空格或换行)

数据范围:输入的字符串长度满足 1≤�≤100 1≤n≤100 

输入描述:

一组字符串。

输出描述:

如果符合要求输出:OK,否则输出NG

示例1

输入:

021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000

复制

输出:

OK
NG
NG
OK

思路

1、直接判断长度就可以解决了 2、这里采用四种正则,同时满足三种以上,就可以通过 3、这是这道题最难的一点,不能有长度大于2的包含公共元素的子串这个可以直接理解为 只要子串长度为3的没有重复,就不会有重复 举例说明:长度为5的子串重复,那就会一定有长度为4的子串重复;长度为4的子串重复,那就会一定有长度为3的子串重复;只要长度为3的子串不重复,就可以满足题目要求

这里我是直接全部将长度为3的子串切出来,然后转化为set,长度和原本一样就说明没有重复

js node 环境下的代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

const rega = /[a-z]/;
const regA = /[A-Z]/;
const reg1 = /\d/;
const regOther = /[^a-z\dA-Z]/;
let sum = 0;
let splitStr = [];
void (async function () {
    // Write your code here
    function splitArr(string) {
        for (let i = 0; i < string.length - 2; i++) {
            splitStr.push(string.slice(i, i + 3));
        }
    }
    while ((line = await readline())) {
        if (line.length >= 8) {
            if (rega.test(line)) sum++;
            if (regA.test(line)) sum++;
            if (reg1.test(line)) sum++;
            if (regOther.test(line)) sum++;
            if (sum >= 3) {
                sum =0
                splitArr(line)
                let splitLength = splitStr.length;
                let setLength = (new Set(splitStr)).size;
                if (splitLength === setLength) {
                    console.log("OK");
                } else {
                    console.log("NG");
                }
            }else{
                console.log("NG");
            }
        }else{
            console.log("NG");
        }
        splitStr =[]
        
    }
})();