Skip to content

描述

密码要求:

1.长度超过8位

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

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

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

输入描述:

一组字符串。

输出描述:

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

示例

输入:

021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000

输出:

OK
NG
NG
OK

代码

思路一:自己的解决思路,完全依据判断逻辑进行长度,字符以及最终重复的判定,不太灵活

python
import re

def has_duplicate_substring(s):
    n = len(s)
    seen = set()
    for k in range(3, n // 2 + 1):
        seen.clear()
        for i in range(n - k + 1):
            substring = s[i : i + k]
            if substring in seen:
                return True
            seen.add(substring)

    return False


def verify(s):
    if len(s) < 9:
        return "NG"
    zz = []
    zz.append(re.search(r"[a-z]", s))
    zz.append(re.search(r"[A-Z]", s))
    zz.append(re.search(r"[0-9]", s))
    zz.append(re.search(r'[^a-zA-Z0-9]', s))
    if zz.count(None) > 1:
        return "NG"
    if has_duplicate_substring(s):
        return "NG"
    return "OK"

while(True):
    try:
        s = input()
        # verify(s)
        print(verify(s))
    except:
        break

思路2:大牛思路,利用Unicode编码来判断字符,解决重复的思路更是巧妙

python
def check(s):
    if len(s) <= 8:
        return 0
    a, b, c, d = 0, 0, 0, 0
    for item in s:
        if ord('a') <= ord(item) <= ord('z'):
            a = 1
        elif ord('A') <= ord(item) <= ord('Z'):
            b = 1
        elif ord('0') <= ord(item) <= ord('9'):
            c = 1
        else:
            d = 1
    if a + b + c + d < 3:
        return 0
    for i in range(len(s)-3):
        if len(s.split(s[i:i+3])) >= 3:
            return 0
    return 1
 
while 1:
    try:
        print('OK' if check(input()) else 'NG')
    except:
        break

总结

正则: Python学习笔记->Python正则表达式

  • 注意search方法匹配到返回匹配对象,例如<re.Match object; span=(4, 5), match='b'>,匹配不到返回None

Unicode: Python学习笔记->Python常见内置函数

  • Python 中的一个内置函数 ord() ,用于获取给定字符的 Unicode 码点(即 Unicode 编码)。