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)

京公网安备 11010502036488号