⌨️最小覆盖子串(leetcode)
题目描述
-
题目:给你一个字符串
s
、一个字符串t
。返回s
中涵盖t
所有字符的最小子串。如果s
中不存在涵盖t
所有字符的子串,则返回空字符串""
。 -
注意
- 对于
t
中重复字符,我们寻找的子字符串中该字符数量必须不少于t
中该字符数量。 - 如果
s
中存在这样的子串,我们保证它是唯一的答案。 s
和t
由英文字母组成。m == s.length
,n == t.length
,1 <= m, n <= 105
。
- 对于
-
输入输出示例
输入-s 输入-t 输出-最小子串 “ADOBECODEBANC” “ABC” “BANC” “a” “a” “a” “a” “aa” “”
算法思想(滑动窗口)
该算法的时间复杂度为 O(m+n)
,是该问题的最优的时间复杂度!
实现步骤
-
定义最小覆盖子串
minSubStr = ""
-
初始化窗口
- 定义两个指针:左指针
left
和右指针right
,分别指向滑动窗口的左右边界 - 初始情况下,
left = 0
,right = 0
right++
用于扩展窗口,left++
用于收缩窗口- 窗口子串为
s.slice(left, right + 1)
- 定义两个指针:左指针
-
扩展窗口:将右指针向右移动,扩展窗口,直到窗口子串是有效子串(即包含
t
中的所有字符) -
收缩窗口:如果窗口子串是有效子串,则尝试将左指针向右移动,直到窗口子串不是有效子串(即不包含
t
中的所有字符) -
循环:回到 Step2,直到右指针
right
到达字符串的末尾注-1:每当扩展窗口导致窗口子串是有效子串,则记录并视情况更新最小覆盖子串
minSubStr
注-2:在窗口收缩的过程中,扩展直到窗口子串有效,收缩直到窗口子串无效,按此反复
窗口有效性判断
- 建立
t
的频数统计哈希表freqT
;建立窗口子串的频数统计哈希表freqWindow
;key
为字符,value
为该字符在字符串中的出现频数(次数) - 建立有效字符计数器
matchedCount
;当窗口子串的某个字符的频数等于t
中对应字符的频数时,matchedCount++
- 每次移动左右指针时,更新
matchedCount
,一旦matchedCount === freqT.size
时,便认为窗口子串是有效的
代码实现
1 | function minWindow(s: string, t: string): string { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 川一土的博客视界!
评论