HJ20 密码验证合格程序
描述
密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有长度大于2的包含公共元素的子串重复 (注:其他符号不含空格或换行)
数据范围:输入的字符串长度满足 1 \le n \le 100 \1≤n≤100
输入描述:
一组字符串。
输出描述:
如果符合要求输出:OK,否则输出NG
示例1
输入:
021Abc9000 021Abc9Abc1 021ABC9000 021$bc9000
输出:
OK NG NG OK
# 判断不能有长度大于2的包括公共元素的字串重复,使用的用一个列表放入所有从序列0开始迭代的字符小串,例如s[0:3],s[1:4],s[2:5] # 如果该列表去重后长度小于原长度,代表有字符小串中有重复的,即不复合条件 def panduan(s): if len(s)<=8: return 0 a,b,c,d = 0,0,0,0 for i in s: if "a"<= i <="z": a = 1 elif "A"<= i <="Z": b = 1 elif ord("0")<= ord(i) <=ord("9"): c = 1 else : d = 1 if a+b+c+d < 3: return 0 L = [] for i in range(len(s)-2): L.append(s[i:i+3]) if len(set(L)) < len(L): return 0 return 1 while True: try: s = input() print("OK" if panduan(s) else "NG") except: break
思考:如果想要知道重复的小串是哪个,例如在"1ABC2ABC"中找到"ABC",而不仅是返回True或者False,如何写:
#如果有重合的子串,例如“1ABC2ABC”,使用“ABC”切割后一定有三个及以上的字串,即切割后的列表长度大于3 s = input() def func(s): for i in range(len(s)-2): if len(s.split(s[i:i+3])) >= 3: print(s[i:i+3]) break
现在是固定字串长度是3,还可以改成通用模板,
#输出字符串中重合的子串,s:字符串 n:子串长度 #例如s="da2da",n=2,输出da s = input() n = int(input()) def func(s): for i in range(len(s)-(n-1)): if len(s.split(s[i:i+n])) >= 3: print(s[i:i+n]) break