You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无重复字符最长子串代码PyCharm正常,LeetCode报索引越界错误原因

问题原因与修复方案

错误根源

return length_of_substring[-1]触发索引越界的核心原因是length_of_substring数组为空,具体有两类触发场景:

  • 输入为空字符串"":for循环完全不执行,数组自始至终没有插入任何元素
  • 输入字符串所有字符全不重复:比如输入"abc",循环全程只走i not in unique_list的分支,从未触发else逻辑执行append操作,数组保持为空

另外你的代码本身还存在逻辑缺陷:即使字符串存在重复字符,循环结束后最后一段无重复子串的长度没有被存入length_of_substring,比如输入"abcabcbb",最后一段"b"的长度不会被记录,会导致计算结果错误。

修复方案

  1. 循环结束后先将当前unique_list的长度追加到length_of_substring中,避免遗漏最后一段无重复子串的长度
  2. 增加空输入判断,输入为空字符串时直接返回0
  3. 无需排序,直接调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 12:45:03