LeetCode最长无重复子串问题:代码在pwwkew/dvdf输入下异常求修正
修正「最长无重复子串」Python代码的问题
原代码的核心问题
- 重复字符处理逻辑错误:遇到重复字符时,你直接将
letters重置为[s[i-1], s[i]]并把counter设为2,这完全错误——正确的做法应该是从重复字符的下一个位置开始重新统计子串,而不是保留前一个字符和当前重复字符。比如输入"dvdf",当遍历到第二个'd'时,应该从'v'开始重新统计,而非保留'v'和'd'。 - 计数器更新逻辑冗余且错误:你通过
i==0或s[i] != s[i-1]来增加counter,但实际上只要当前字符不在letters中,直接通过len(letters)就能得到当前子串长度,不需要额外条件判断。 - 未处理最后一段子串:只有遇到重复字符时才更新
max_length,但如果最后一段无重复子串是最长的,你的代码会漏掉这个更新。 - 特殊判断多余:
len(set(s)) ==1的判断可以被通用逻辑覆盖,无需单独处理。
修正后的代码(简化版)
这个版本基于你原有的列表思路优化,逻辑更清晰:
def lengthOfLongestSubstring(s): current_sub = [] max_len = 0 for char in s: # 若当前字符已在子串中,截断到重复字符的下一位 if char in current_sub: idx = current_sub.index(char) current_sub = current_sub[idx+1:] # 添加当前字符到子串 current_sub.append(char) # 实时更新最大长度 max_len = max(max_len, len(current_sub)) return max_len
更高效的滑动窗口版本(O(n)时间复杂度)
上面的版本中list.index()是O(n)操作,对于长字符串效率较低。用哈希表记录字符的最新索引,配合双指针实现滑动窗口,能将时间复杂度降到O(n):
def lengthOfLongestSubstring(s): char_pos = {} max_len = 0 left = 0 # 滑动窗口左边界 for right, char in enumerate(s): # 若字符已存在且在当前窗口内,移动左边界到重复字符的下一位 if char in char_pos and char_pos[char] >= left: left = char_pos[char] + 1 # 更新字符的最新位置 char_pos[char] = right # 计算当前窗口长度并更新最大值 max_len = max(max_len, right - left + 1) return max_len
测试验证
- 输入
"pwwkew":两个版本均返回3(对应子串"wke"或"kew") - 输入
"dvdf":两个版本均返回3(对应子串"vdf")
内容的提问来源于stack exchange,提问作者AT Hill
相关产品推荐
相关产品推荐

