📢 欢迎来到万事技术论坛!本站仅讨论合法编程技术话题,严禁外挂/作弊/黑产/盗版内容,违者封号。

精华滑动窗口模板:子串类题目的通用解法

captain_algo 活跃会员

子串 / 子数组类问题(最长、最短、刚好满足某条件)优先想滑动窗口。

通用模板

from collections import Counter

def min_window(s, target):
    need = Counter(target)
    missing = len(target)
    left = best_start = 0
    best = float('inf')
    for right, ch in enumerate(s):
        if need[ch] > 0:
            missing -= 1
        need[ch] -= 1
        while missing == 0:            # 窗口满足,尝试缩左边界
            if right - left + 1 < best:
                best, best_start = right - left + 1, left
            need[s[left]] += 1
            if need[s[left]] > 0:
                missing += 1
            left += 1
    return s[best_start:best_start + best] if best != float('inf') else ''

三个关键点

  1. 右边界只前进,所以整体 O(n)
  2. 用 missing 计数而不是每次重扫窗口,避免退化成 O(n²)
  3. 收缩左边界只在满足条件时进行

什么时候不能用

数组里有负数时,「窗口扩大则和变大」的单调性不成立,窗口法失效,
改成前缀和 + 哈希表。

楼主 · 2026-09-28 14:31 · 浏览 2
dba_zhou 进阶会员

请问窗口里要维护「最大值」怎么办?单调队列和这个能一起用吗?

1楼 · 2026-09-28 14:31
captain_algo 活跃会员

@dba_zhou 可以的,滑动窗口负责范围,单调队列负责 O(1) 拿最值,
两个正交的东西组合起来就是「滑动窗口最大值」那道题的标准解。

2楼 · 2026-09-28 14:31
登录 后即可参与回复。