Leecode 0076. Minimum Window Substring
76. Minimum Window Substring
题目
Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n).
Example:
1 | Input: S = "ADOBECODEBANC", T = "ABC" |
Note:
- If there is no such window in S that covers all characters in T, return the empty string "".
- If there is such window, you are guaranteed that there will always be only one unique minimum window in S.
题目大意
给定一个源字符串 s,再给一个字符串 T,要求在源字符串中找到一个窗口,这个窗口包含由字符串各种排列组合组成的,窗口中可以包含 T 中没有的字符,如果存在多个,在结果中输出最小的窗口,如果找不到这样的窗口,输出空字符串。
解题思路
滑动窗口(双指针)+ 哈希表的组合:
哈希表预处理:
- 用哈希表(
map
或数组)统计t
中每个字符的出现次数(记为need
) - 用另一个哈希表(
window
)记录当前窗口中各字符的出现次数
滑动窗口操作:
- 右指针
right
扩大窗口,将字符加入window
,直到窗口包含t
中所有字符 - 左指针
left
缩小窗口,尝试找到最小长度的有效子串 - 用变量
valid
记录窗口中满足need
要求的字符数量,当valid
等于t
中不同字符的数量时,窗口有效
更新结果:
- 每次窗口有效时,比较并更新最小子串的起始位置和长度
1 | #include <string> |
哈希表初始化:
need
存储t
中每个字符的出现次数(如t="ABC"
,need
为{'A':1, 'B':1, 'C':1}
)window
动态记录当前窗口中各字符的出现次数
扩大窗口(右指针移动):
- 每次将
s[right]
加入window
,如果该字符是t
中需要的,且数量达到need
中的要求,则valid
加 1 - 当
valid
等于need.size()
时,说明窗口已包含t
中所有字符
缩小窗口(左指针移动):
- 窗口有效时,尝试左移左指针以减小窗口长度
- 每次移除
s[left]
,如果该字符是t
中需要的,且数量从满足需求变为不满足,则valid
减 1 - 每次缩小窗口前,先检查当前窗口是否是最小长度,更新
start
和len
结果处理:
- 如果
len
仍为INT_MAX
,说明没有找到有效子串,返回""
- 否则返回从
start
开始、长度为len
的子串
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.