【LeetCode】76. Minimum Window Substring 解题记录
问题描述
Given two strings s and t of lengths m and n respectively, return the minimum window in s which will contain all the characters in t. If there is no such window in s that covers all characters in t, return the empty string “”.
Note that If there is such a window, it is guaranteed that there will always be only one unique minimum window in s.
测试样例
1 | Input: s = "ADOBECODEBANC", t = "ABC" |
1 | Input: s = "a", t = "a" |
说明
1 | m == s.length |
解题
思路
使用滑动窗口求解,两个指针 left
和 right
都从最左端向最右端移动,且 left
的位置一定在 right
的左边或重合。
flag_chars
记录每个字符是否在t
中存在;cnt_chars
记录目前每个字符缺少的数量,- 移动窗口右边界,边界字符在
t
中出现过,该字符缺少的数量cnt_chars[c]
-1
,若缺少数量>=0
则该字符有效(若<0
表示窗口中该字符数量大于t
中该字符数量),有效数字cnt_valid_char
计数+1
, - 若窗口中有效字符数与 t 中相同,得到符合题目的一个解,将其与最小解比较并记录。此时,移动窗口左边界,直到窗口不符合题目,退出内层循环。
补充:
- 双指针
- 滑动窗口
- 使用长度为
128
的数组来映射字符 - 需要单独判断无解的情况
flag_ok
- 时间复杂度
O(n)
虽然在for
循环里出现了一个while
循环,但是因为while
循环负责移动left
指针,且left
只会从左到右移动一次,因此总时间复杂度仍然是O(n)
代码
1 | import java.util.Arrays; |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 哆啦 C 梦!
评论