描述:
密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有长度大于2的不含公共元素的子串重复 (注:其他符号不含空格或换行)
数据范围:输入的字符串长度满足 1≤n≤100
输入描述:一组字符串。
输出描述:如果符合要求输出:OK,否则输出NG
示例1
输入:
021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
输出:
OK
NG
NG
OK
def CheckPassword(strs:str) -> bool:
if len(strs) < 8: # 长度小于8,密码不合理
return False
ListSub = []
for i in range(len(strs)-2):
ListSub.append(strs[i:i+3]) # 以3个长度为子串进行切割,确认是否有重复子串;如果4个有重复,3个肯定也有重复
if len(set(ListSub)) != len(ListSub): # 集合会去重,如果集合和列表的长度不一致,说明有重复子串,密码不合理
return False
arrIndex = [] # arrIndex是保证数字/大写字母/小写字母/其他字符只统计一次
arrCount = 0 # 统计出现字符的种类,除
for x in strs:
if x.isdigit() and ("num" not in arrIndex):
arrIndex.append("num")
arrCount += 1
elif x.islower() and ("lower" not in arrIndex):
arrIndex.append("lower")
arrCount += 1
elif x.isupper() and ("upper" not in arrIndex):
arrIndex.append("upper")
arrCount += 1
elif not x.isdigit() and not x.islower() and not x.isupper() and x not in arrIndex: # 其他字母,可能有不同种类,要单独统计
arrIndex.append(x)
arrCount += 1
if arrCount >=3: # 如果字符种类超过3种,则符合预期;负责不符合预期
return True
return False
while True: # 因为题目涉及多次输入,所以需要一个死循环
try:
InputStr = input()
print("OK" if CheckPassword(InputStr) else "NG")
except:
break