题解 | #密码验证合格程序#

密码验证合格程序

http://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841

let input = readline();
const inputList = [];
while(input) {
  inputList.push(input);
  input = readline();
}

function validator(str) {
  if (str.length < 9) {
    return false;
  }
  // 大写字母
  const upperLetter = /[A-Z]/;
  // 小写字母
  const lowerLetter = /[a-z]/;
  // 数字
  const num = /[0-9]/;
  // 其他字符,不含空格或换行
  const others = /[^a-z0-9\s]/i;
  // 统计满足的条件个数,至少满足三个条件
  let count = 0;
  if (upperLetter.test(str)) {
    count++;
  }
  if (lowerLetter.test(str)) {
    count++;
  }
  if (num.test(str)) {
    count++;
  }
  if (others.test(str)) {
    count++;
  }
  // 至少满足三个条件,否则校验失败
  if (count < 3) {
    return false;
  }
  // 判断是否存在长度大于2且没有公共元素的重复子串,
  // 把字符串按长度为3的大小拆分成段,判断这些字符串段中是否有重复的,
  // 而且也要判断重复的两段字符串是否有公共元素,用下标是否存在交集判断,
  // 如果存在交集,则还不属于“长度大于2的不含公共元素的子串重复”,map中只记录
  // 某种长度为3的子串第一次出现时的开始和结束下标。
  const arr = str.split('');
  // <key, value>,key: 长度为3的子串,value: [startIdx, endIdx],子串key第一次出现时的开始和结束下标
  const map = new Map();
  for (let i = 0, len = arr.length; i < len - 2; i++) {
    const s = `${arr[i]}${arr[i + 1]}${arr[i + 2]}`;
    // 有长度大于2的重复字串
    if (map.has(s)) {
      const range = map.get(s);
      // 进一步判断两个重复子串有没有公共元素,没有公共元素则校验失败
      if (i > range[1]) {
        return false;
      }
    } else {
      map.set(s, [i, i + 2]);
    }
  }
  return true;
}

inputList.forEach(ipt => {
  if (validator(ipt)) {
    console.log('OK');
  } else {
    console.log('NG');
  }
});

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务