LeetCode最长无重复字符子串问题:b=s[0]引发运行时错误求排查
最长无重复字符子串代码问题分析
运行时错误的直接原因
- 空字符串索引越界:当输入
s是空字符串时,s[0]会直接抛出IndexError。你测试时可能没覆盖空串用例,但LeetCode的测试集包含这种情况,这就是提交报错的根源。
代码里的其他逻辑问题
除了上述致命错误,你的代码还有不少逻辑漏洞,会导致部分测试用例结果错误:
- 初始值未加入记录:一开始
b = s[0],但没把这个初始子串加入h列表,比如输入"a"时,h是空的,最后靠max==0返回1,虽然结果对,但逻辑不严谨。 - 循环遗漏最后一个字符处理:循环里
i < N-1的判断,会导致当i是最后一个索引时,直接执行else把b设为s[i],但没把这个子串加入h,如果最后一个字符是新的无重复子串,就会被遗漏。 - 返回值逻辑错误:当
max==0时返回1,但如果输入是空串,正确返回值应该是0,这里会导致空串用例结果错误。 - 变量命名不规范:用了Python内置函数名
max作为变量名,虽然不会报错,但容易混淆,不推荐。
修复后的代码
class Solution(object): def lengthOfLongestSubstring(self, s): if not s: return 0 max_len = 0 current_sub = "" for char in s: if char not in current_sub: current_sub += char max_len = max(max_len, len(current_sub)) else: # 截断到重复字符的下一位,再拼接当前字符 idx = current_sub.index(char) current_sub = current_sub[idx+1:] + char return max_len
修复要点
- 先处理空串,直接返回0,彻底避免索引越界问题。
- 遍历每个字符时,动态维护当前无重复子串
current_sub,不用额外存储所有子串,效率更高。 - 遇到重复字符时,截断
current_sub到重复位置之后,再加入当前字符,保证子串始终无重复。 - 遍历过程中实时更新最大长度,不用事后遍历
h列表统计。
内容的提问来源于stack exchange,提问作者Mark Heo
相关产品推荐
相关产品推荐

