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))
修正说明
- 拆分
append()操作:先截断curr得到新列表,再调用append(),确保curr始终是列表类型,不会变成None。 - 同步维护
char集合:移除curr截断部分的字符,保证集合中的元素和当前子串完全一致。 - 直接维护长度而非列表:用
longest_len记录最长长度,避免不必要的列表拷贝,提升效率。
内容的提问来源于stack exchange,提问作者Tommaso Donato
相关产品推荐
相关产品推荐

