求解最长无重复子串变体时陷入while循环困境
解决最长无重复子串代码中while循环死循环的问题
你的代码卡在第一个while循环,大概率是循环条件永远为真或者循环控制变量没有正确更新,结合最长无重复子串的常见解法(比如滑动窗口),以下是最可能的问题点和修复方案:
常见死循环原因&错误示例
最典型的错误是滑动窗口的右指针(或左指针)在循环内没有移动,导致循环条件一直满足:
def longest_unique_substring(s): max_len = 0 start = 0 char_map = {} end = 0 result = "" while end < len(s): if s[end] in char_map: start = max(start, char_map[s[end]] + 1) current_len = end - start + 1 if current_len > max_len: max_len = current_len result = s[start:end+1] # 这里漏掉了end += 1,导致end永远为0,循环无限执行 return result
这段代码里end变量始终没有递增,end < len(s)永远成立,直接造成死循环。
修复后的正确滑动窗口实现
def longest_unique_substring(s): max_len = 0 start = 0 char_map = {} # 存储字符最新出现的索引 result = "" end = 0 while end < len(s): # 只有当字符已存在且在当前窗口内时,才移动左指针 if s[end] in char_map and char_map[s[end]] >= start: start = char_map[s[end]] + 1 # 更新当前字符的最新索引 char_map[s[end]] = end # 计算当前窗口长度并更新最长子串 current_len = end - start + 1 if current_len > max_len: max_len = current_len result = s[start:end+1] # 必须推进右指针,让循环能正常终止 end += 1 return result
调试检查清单
排查死循环时可以重点看这几点:
- 确认while的终止条件(比如
end < len(s))会在某个时刻变为假 - 检查循环内的控制变量(如
end、start)是否有正确的递增/递减操作 - 哈希表类解法中,确保每次循环都更新字符的索引,避免重复判断逻辑出错
内容的提问来源于stack exchange,提问作者Aboullkhill
相关产品推荐
相关产品推荐

