描述
密码要求:
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 编码)。