LC 76滑动窗口与前缀和困难第 11 / 95 题

最小覆盖子串

Minimum Window Substring

滑动窗口计数
本机进度仅保存在当前浏览器

题目描述

给你字符串 s 和 t,返回 s 中涵盖 t 所有字符(含重复次数)的最小子串;不存在则返回空串。数据保证答案唯一。

示例:s = "ADOBECODEBANC",t = "ABC",输出 "BANC"。

解题思路

  1. 不定长窗口模板题:右指针扩张到窗口满足要求,再尽量收缩左指针,反复记录最短可行窗口。
  2. 用两个计数器:need 记录 t 的字符需求,window 记录当前窗口内相关字符数。
  3. 引入满足变量 formed:每当某字符数量首次达标 formed 加一,收缩时首次跌破则减一,避免每次全表比较。
  4. 收缩到刚好不满足为止,期间的最小窗口即答案,整体 O(|s| + |t|)。

参考实现

查看参考实现Python · 建议先自行作答
from collections import Counter

def minWindow(s, t):
    need = Counter(t)
    window = {}
    formed = l = 0
    best_len, best_l = len(s) + 1, 0
    for r, ch in enumerate(s):
        window[ch] = window.get(ch, 0) + 1
        if ch in need and window[ch] == need[ch]:
            formed += 1
        # 满足全部需求时收缩左端
        while formed == len(need):
            if r - l + 1 < best_len:
                best_len, best_l = r - l + 1, l
            left = s[l]
            window[left] -= 1
            if left in need and window[left] < need[left]:
                formed -= 1
            l += 1
    return '' if best_len > len(s) else s[best_l:best_l + best_len]

复杂度与归属

时间复杂度O(|s| + |t|)
空间复杂度O(|Σ|)
所属分类滑动窗口与前缀和
题源LeetCode 76

关联教程

返回题图鉴