Python重复子串模式判断代码处理超长字符串错误排查
重复子串模式问题代码错误原因分析
核心错误点
1. 计数变量未重置
你代码中的count = 0初始化语句放在了候选子串遍历循环的外部,每次校验完一个候选子串后,count的累计值不会被清空,校验下一个候选子串时会复用之前的计数结果,极易提前满足count == len(s)/lenOfRepStr的判断条件,错误返回True。
这就是你遇到的「中间片段存在不匹配仍返回True」的直接原因:前一个候选子串校验时累计的count值,加上当前候选子串前几次匹配的计数,刚好凑够了判断阈值,哪怕当前子串后续片段不匹配,也会被误判为符合要求。
2. 校验遍历区间设置错误
你写的range(0, len(s) - lenOfRepStr + 2, lenOfRepStr)属于冗余的错误写法,正确的遍历区间应为range(0, len(s), lenOfRepStr):因为步长是重复子串的长度,直接遍历到原字符串末尾即可,错误的区间参数会增加无效的切片校验,极端场景下也可能引发计数异常。
修正后的代码
def repeated(s): repeatedStrs = [] i = int(len(s)/2) while i != 0: if s[0:i] == s[-i:]: repeatedStrs.append(s[0:i]) i -= 1 for repeatedStr in repeatedStrs: count = 0 # 每次校验新候选子串时重置计数 lenOfRepStr = len(repeatedStr) if lenOfRepStr > 0 and len(s) % lenOfRepStr == 0: # 修正遍历区间 for q in range(0, len(s), lenOfRepStr): if repeatedStr != s[q : q+lenOfRepStr]: break count += 1 if count == len(s)/lenOfRepStr: return True return False
内容的提问来源于stack exchange,提问作者Bilal
相关产品推荐
相关产品推荐

