LeetCode提交报错:'NoneType' object is not iterable问题求助
问题排查:LeetCode最长无重复子串代码报错分析
报错直接原因
你遇到的TypeError: 'NoneType' object is not iterable错误,核心是select_list(s)函数在部分场景下返回了None,而max()函数要求传入可迭代对象(比如列表),传入None直接触发该错误。
具体代码问题点
1. select_list函数缺少默认返回值
看select_list的代码:
def select_list(st): list2 = [] list2.append(select(st)) if len(st) > 1: st = (st[len(select(st))::]) list2.append(select(st)) return list2
当输入的st长度≤1时(比如空字符串、单字符字符串),代码不会进入if len(st) >1分支,函数没有显式return语句,Python会默认返回None。此时max(select_list(s))等价于max(None),直接引发报错。
2. select函数在无重复字符时返回None
select函数仅在遇到重复字符时返回list1,但如果输入字符串所有字符都不重复(比如"abc"),遍历结束后没有触发else分支,函数同样无显式return,会返回None。这会导致list2中被添加None元素,后续计算max时也会出问题。
3. select_list的逻辑不完整
当前select_list仅处理两次select调用,完全覆盖不了所有可能的无重复子串场景。比如对"abcabcbb",你只取了前两个无重复子串,但实际需要遍历每个起始位置,生成所有可能的无重复子串才能找到最长的那个。
修复建议(基础版本)
先解决报错问题,再完善逻辑:
- 给
select函数添加默认返回,遍历结束后返回收集到的列表:
def select(s): list1 = [] for i in s: if i not in list1: list1.append(i) else: return list1 return list1 # 遍历完所有字符后返回完整列表
- 给
select_list添加默认返回,同时修改逻辑遍历所有可能的子串:
def select_list(st): list2 = [] current_st = st while len(current_st) > 0: sub = select(current_st) list2.append(sub) # 从重复字符的下一位开始新的子串遍历 if len(sub) < len(current_st): dup_pos = current_st.index(sub[-1], len(sub)) current_st = current_st[dup_pos+1:] else: break return list2
- 计算最长长度时处理空输入场景:
sub_lengths = [len(sub) for sub in select_list(s)] result = max(sub_lengths, default=0) return result
如果追求更优性能,推荐使用滑动窗口算法,避免生成所有子串,降低时间复杂度。
内容的提问来源于stack exchange,提问作者Dmitry Trump
相关产品推荐
相关产品推荐

