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 =[]
}
})();