You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

滑动窗口算法求最长无重复子串无结果,终端输出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))

问题分析

  1. 输出None的直接原因:函数longest_substring没有返回值,Python中无return语句的函数默认返回None,所以print时输出None。
  2. 核心逻辑错误:
    • 初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 09:22:39