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

为何LeetCode无重复最长子串解法的嵌套循环时间复杂度为O(n)

关于「无重复字符的最长子串」解法时间复杂度的疑问

我在做LeetCode题目《无重复字符的最长子串》时,看到了如下滑动窗口解法:

# 使用集合记录窗口内的字符
window = set()
res = 0
l = 0
for r in range(len(s)):
    # 遇到重复字符时,移动左指针直到窗口内无重复
    while s[r] in window:
        window.remove(s[l])
        l += 1

    # 将当前字符加入窗口,更新最长子串长度
    window.add(s[r])
    res = max(res, r-l+1)
        
return res

视频里提到这个程序的时间复杂度为O(n),但我对此感到困惑:代码在for循环内包含一个条件while循环,这不应该是O(n²)吗?我刚接触大O表示法,不清楚不同场景下嵌套循环的时间复杂度如何计算。


解答

大O表示法衡量的是所有元素被操作的总次数上限,不是单纯看循环嵌套层数。

看这段代码里的左右指针l和r:

  • r指针从0到len(s)-1,每个字符只被遍历一次,总次数是n次。
  • l指针只会向右移动,不会回退,每个字符最多被从集合window中移除一次,总次数也是n次。

也就是说,while循环里的操作整个程序运行下来总共只会执行n次,不会出现外层循环每跑一次,内层循环就跑n次的情况。比如处理字符串"abcabcbb"时,l只会在遇到重复字符时右移,但每个字符只会被l处理一次,不会反复操作。

所以整个程序所有操作的总次数是O(n) + O(n) = O(n),而非O(n²)。

内容的提问来源于stack exchange,提问作者enigma312

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:42:44