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

LeetCode最长无重复子串报错:TypeError: NoneType无len()属性求解

最长无重复子串代码错误分析与修复

错误根源

你代码里的这行代码是问题核心:

curr = curr[curr.index(s[i])+1:].append(s[i])

列表的append()方法没有返回值(返回None),执行这行后curr会被赋值为None,后续调用max(curr, longest, key=len)时,自然会抛出"Nonetype has no len()"的错误。

隐藏问题

你的char集合没有同步更新:当curr因为重复字符被截断后,集合里还保留着那些已经从curr中移除的字符,会导致后续的字符重复判断出错。

修正后的代码

class Solution(object):
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        char = set()
        longest_len = 0
        curr = []
        for c in s:
            if c in char:
                # 更新最长子串长度
                longest_len = max(longest_len, len(curr))
                # 找到重复字符的位置并截断curr
                idx = curr.index(c)
                # 从集合中移除被截断的字符
                for removed_char in curr[:idx+1]:
                    char.remove(removed_char)
                # 重新构建当前子串
                curr = curr[idx+1:]
                curr.append(c)
                char.add(c)
            else:
                curr.append(c)
                char.add(c)
        # 最后再比较一次,防止最长子串在字符串末尾
        return max(longest_len, len(curr))

修正说明

  1. 拆分append()操作:先截断curr得到新列表,再调用append(),确保curr始终是列表类型,不会变成None。
  2. 同步维护char集合:移除curr截断部分的字符,保证集合中的元素和当前子串完全一致。
  3. 直接维护长度而非列表:用longest_len记录最长长度,避免不必要的列表拷贝,提升效率。

内容的提问来源于stack exchange,提问作者Tommaso Donato

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:25:20