如何修改无重复字符最长子串代码以适配所有测试用例?
修复「无重复字符的最长子串」代码:解决重复字符后从正确位置重启的问题
你的代码核心问题是遇到重复字符时直接清空当前子串并从头开始,而正确逻辑应该是从重复字符的下一个位置保留现有子串的有效部分,继续向后遍历。以下是修改后的代码,同时保留你原有代码的核心结构:
class Solution: def lengthOfLongestSubstring(self, s: str) -> int: substring_length = {} i = 0 count = 0 char = "" # 新增变量实时跟踪最大长度,避免最后遍历字典的开销 max_length = 0 while i < len(s): if s[i] not in char: char += s[i] count += 1 i += 1 # 每次更新当前子串时同步记录长度和最大长度 substring_length[char] = count if count > max_length: max_length = count else: # 找到重复字符在当前子串中的位置 duplicate_pos = char.index(s[i]) # 截断子串,保留重复位置之后的部分 char = char[duplicate_pos + 1:] # 更新当前子串长度为截断后的长度 count = len(char) # 此处不重置i,当前字符s[i]会在下一轮循环被加入新子串 # 处理空字符串或全重复字符的边界情况 if not substring_length: return len(s) return max_length
关键修改点说明:
- 重复字符处理逻辑:
- 不再清空
char和重置count,而是通过char.index(s[i])找到重复字符的位置,截断子串到该位置的下一位,保留后续有效部分(比如处理"dvdf"时,遇到第二个'd',子串从"dv"变成"v") - 更新
count为截断后子串的长度,而非重置为0
- 不再清空
- 避免遗漏最后子串:
- 原代码仅当
i == len(s)时才记录子串,现在每次添加字符后都同步更新substring_length和max_length,确保所有有效子串都被记录
- 原代码仅当
- 效率优化:
- 新增
max_length变量实时跟踪最大长度,无需最后遍历字典取最大值,提升性能
- 新增
测试"dvdf"的执行流程:
- 初始状态:
char="",count=0,i=0 - i=0:添加'd' →
char="d",count=1,i=1,max_length=1 - i=1:添加'v' →
char="dv",count=2,i=2,max_length=2 - i=2:发现'd'在
char中,找到位置0,截断为char="v",count=1 - i=2:添加'd' →
char="vd",count=2,i=3,max_length保持2 - i=3:添加'f' →
char="vdf",count=3,i=4,max_length=3 - 循环结束,返回3,符合预期结果
内容的提问来源于stack exchange,提问作者momo123321
相关产品推荐
相关产品推荐

