无重复字符最长子串代码PyCharm正常,LeetCode报索引越界错误原因
问题原因与修复方案
错误根源
return length_of_substring[-1]触发索引越界的核心原因是length_of_substring数组为空,具体有两类触发场景:
- 输入为空字符串
"":for循环完全不执行,数组自始至终没有插入任何元素 - 输入字符串所有字符全不重复:比如输入
"abc",循环全程只走i not in unique_list的分支,从未触发else逻辑执行append操作,数组保持为空
另外你的代码本身还存在逻辑缺陷:即使字符串存在重复字符,循环结束后最后一段无重复子串的长度没有被存入length_of_substring,比如输入"abcabcbb",最后一段"b"的长度不会被记录,会导致计算结果错误。
修复方案
- 循环结束后先将当前
unique_list的长度追加到length_of_substring中,避免遗漏最后一段无重复子串的长度 - 增加空输入判断,输入为空字符串时直接返回0
- 无需排序,直接调用
max()方法取最大值即可,降低时间复杂度
修复后代码
class Solution: def lengthOfLongestSubstring(self, string): unique_list = [] length_of_substring = [] # 空输入直接返回0 if not string: return 0 for i in string: if i not in unique_list: unique_list.append(i) else: length_of_substring.append(len(unique_list)) unique_list.clear() unique_list.append(i) # 追加最后一段子串的长度 length_of_substring.append(len(unique_list)) return max(length_of_substring) if __name__ == '__main__': s = input() obj = Solution() result = obj.lengthOfLongestSubstring(s) print(result)
逻辑优化(可选)
上述修复仅解决了索引越界问题,但你当前“遇到重复就清空列表”的逻辑仍有缺陷,比如输入"dvdf"时,会漏掉"vdf"这段长度为3的子串,最终返回错误结果2。如果需要覆盖所有测试用例,可调整重复时的处理逻辑,避免误删有效字符:
class Solution: def lengthOfLongestSubstring(self, string): unique_list = [] max_len = 0 for i in string: if i in unique_list: # 仅截断到重复字符的下一个位置,保留后面的有效字符 idx = unique_list.index(i) unique_list = unique_list[idx+1:] unique_list.append(i) max_len = max(max_len, len(unique_list)) return max_len
内容的提问来源于stack exchange,提问作者Rajesh-1729
相关产品推荐
相关产品推荐

