HJ20_密码验证合格程序_仿真_判断重复子串的巧妙
这题最巧的是如何判断密码含有字符串。
最巧妙的是如何判断一串字符串中是否包含重复子串:
思路:for 循环提取可能的重复子串,通过子串作为划分字符串的依据,判断划分后的字符串是否长度大于等于3,则可判断字符串中是否含有两个或两个以上重复子串。简短两行,要注意index不能超出数组。
16 for i in range(len(s)-3): 17 if len(s.split(s[i:i+3])) >= 3: 18 return 0
下面是高赞题解,直接赋值高手答案如下:
1 def check(s): 2 if len(s) <= 8: 3 return 0 4 a, b, c, d = 0, 0, 0, 0 5 for item in s: 6 if ord('a') <= ord(item) <= ord('z'): 7 a = 1 8 elif ord('A') <= ord(item) <= ord('Z'): 9 b = 1 10 elif ord('0') <= ord(item) <= ord('9'): 11 c = 1 12 else: 13 d = 1 14 if a + b + c + d < 3: 15 return 0 16 for i in range(len(s)-3): 17 if len(s.split(s[i:i+3])) >= 3: 18 return 0 19 return 1 20 21 while 1: 22 try: 23 print('OK' if check(input()) else 'NG') 24 except: 25 break
下面自己的解答,虽然是正确的,但是一对比就能看出高手设计的优雅和巧妙
1 import sys 2 in1=[] 3 for i in sys.stdin: 4 in1.append(str(i.strip())) 5 #print(in1) 6 for i in in1: 7 d={} 8 check=0 9 if len(str(i))<8: 10 print("NG") 11 check=1 12 else: 13 if i.isdigit() or i.isalpha(): 14 print("NG") 15 check=1 16 else: 17 for j in i: 18 if j=="\n" or j==' ': 19 print("NG") 20 check=1 21 elif j.isdigit(): 22 d[1]=1 23 elif j.isupper(): 24 d[2]=1 25 elif j.islower(): 26 #print(j,i) 27 d[3]=1 28 else: 29 d[4]=1 30 if check==0 and len(d)<3: 31 print("NG") 32 check=1 33 #print(d,i) 34 if check==0: 35 for n,j in enumerate(i): 36 for m,k in enumerate(i): 37 if k==j and i[n:n+3]==i[m:m+3] and n+1<m: 38 print("NG") 39 check=1 40 break 41 if check==1: 42 break 43 if check==0: 44 print("OK")