滑动窗口算法求最长无重复子串无结果,终端输出None求助
滑动窗口求解最长无重复字符子串长度的问题修复
问题情况
运行代码后终端输出None,运行信息如下:
/usr/local/bin/python3.12/Users/jaredmccarthy/Desktop/2025/ejercicios_leetcode.py None Process finished with exit code 0
需求是用滑动窗口算法计算最长无重复字符子串的长度,尝试过while循环搭配起始指针的方式但遍历不全,改为for循环结合双指针后仍无有效输出,错误代码如下:
def longest_substring(s): ventana = set(s) max_longitud = 0 inicio = 0 for fin in range(len(s)): if fin != len(ventana): ventana.add(fin) max_longitud += 1 if fin == len(s): ventana.remove(inicio) inicio += 1 if __name__ == "__main__": s = "abcabcbb" print(longest_substring(s))
问题分析
- 输出
None的直接原因:函数longest_substring没有返回值,Python中无return语句的函数默认返回None,所以print时输出None。 - 核心逻辑错误:
- 初始化
ventana = set(s)直接把整个字符串转成集合,违背了滑动窗口动态维护当前窗口的思路; - 循环中操作的是索引而非字符串字符,完全搞错了判断重复的对象;
- 条件判断
fin != len(ventana)和fin == len(s)逻辑无效,后者永远不会触发(fin最大为len(s)-1); max_longitud的更新方式错误,没有正确计算当前窗口长度。
- 初始化
修复后的代码
def longest_substring(s): ventana = set() max_longitud = 0 inicio = 0 for fin in range(len(s)): # 当前字符已在窗口中,移动左指针移除重复字符 while s[fin] in ventana: ventana.remove(s[inicio]) inicio += 1 # 将当前字符加入窗口 ventana.add(s[fin]) # 更新最大长度 current_length = fin - inicio + 1 if current_length > max_longitud: max_longitud = current_length # 返回计算结果 return max_longitud if __name__ == "__main__": s = "abcabcbb" print(longest_substring(s)) # 输出3
逻辑说明
- 用集合
ventana动态维护当前窗口内的无重复字符; - 右指针
fin遍历每个字符,若当前字符已在窗口中,不断移动左指针inicio并移除对应字符,直到窗口中无重复; - 每次加入新字符后,计算当前窗口长度(
fin - inicio + 1),更新最大长度; - 函数返回最终的最大长度,确保print能输出有效结果。
内容的提问来源于stack exchange,提问作者Jared McCarthy
相关产品推荐
相关产品推荐

