题解 | 密码验证合格程序
密码验证合格程序
https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841
2025.3.27的版本,笨比题目写错,测试案例也写错
合格的密码要求:
- 长度要超过 8 位∙
- 必须包含大写字母、小写字母、数字、特殊字符中的至少三种∙
- 不能分割出两个独立的、长度大于 22 的连续子串,使得这两个子串完全相同;更具体地,如果存在两个长度大于 22 的独立子串 s1,s2s1,s2 ,使得 s1=s2s1=s2 ,那么密码不合法。
测试案例:
输入:
021Abc9000 021Abc9Abc1 021ABC9000 021$bc9000 021Abc1111
输出:(第五个是NG,111重复)
OK NG NG OK NG
输入:
Abc1@ A1@ababa@1A
输出:(第二个aba重复)
NG NG
import sys """ 如何找到一个字符串的所有长度大于2的子字符串 """ # secret = sys.stdin.read().strip().split("\n") secret = [] for _ in sys.stdin: _ = _.strip() if not _: # 如果输入空行终止 break secret.append(_) # print(secret) # 遍历所有密码判断 for i in range(len(secret)): # 检查长度 if len(secret[i]) < 8: print("NG") # 如果连长度都不满足,直接NG continue # 遍历每一个密码内部 type = [0, 0, 0, 0] # 记录字符种类 secret_mini = [] # 列表存储子字符串 back = 0 # 如果子字符串重复,为1 for j in range(len(secret[i])): str1 = str(secret[i]) # 检查子字符串是否重复 if back == 1: break # 如果是大写字母 if 65 <= ord(str1[j]) <= 90: if type[0] == 0: type[0] += 1 # 如果是小写字母 elif 97 <= ord(str1[j]) <= 122: if type[1] == 0: type[1] += 1 # 如果是数字 elif 48 <= ord(str1[j]) <= 57: if type[2] == 0: type[2] += 1 # 如果是特殊字符 elif ( 33 <= ord(str1[j]) <= 46 or 58 <= ord(str1[j]) <= 64 or 91 <= ord(str1[j]) <= 96 or 123 <= ord(str1[j]) <= 126 ): if type[3] == 0: type[3] += 1 # 如果都不是 else: print("NG") break # 异常不合格此密码直接NG # 找到字符串长度大于2的所有子串 for t in range(j + 3, len(secret[i]) + 1): if t > len(secret[i]) + 1: break str2 = str1[j:t] if str2 not in secret_mini: secret_mini.append(str2) # 如果存在,说明重复 else: print("NG") back = 1 break # 检查字符种类 if len(secret[i]) > 8 and back == 0: sum_type = 0 for x in range(4): sum_type += type[x] if sum_type < 3: print("NG") # 种类没有三种直接NG continue else: print("OK") # 长度、种类、重复子串都合格
核心知识10:查找字符串长度大于2的所有子字符串+未知行数输入读取
字符串查找
def find_substrings(s): substrings = [] n = len(s) for i in range(n): for j in range(i+3, n+1): # j至少比i大3,保证长度>2 substrings.append(s[i:j]) return substrings
未知行数输入读取
使用这行代码可以读取所有的输入,但在本地编译器运行的时候,一直输入不终止,无法结束输入
sys.stdin.read().strip().split("\n")
原因分析:
在线代码平台(牛客网)输入方法可能使用的是命令行定向输入
python your_script.py < input.txt
解决办法:
import sys lines = [] for line in sys.stdin: line = line.strip() if not line: # 空行时终止输入 break lines.append(line) # print(lines)