76. Minimum Window Substring
題目網址:https://leetcode.cn/problems/minimum-window-substring/
題意:給兩 string
s
和t
, 返回s
中包含t
所有 character 的最小 substring。若不存在這樣的 substring, 則返回 empty string""
。
s
和t
由英文字母組成。進階:設計 $O(n)$ time 的演算法。
Solution:
想法:利用 Sliding Window, 用兩個 pointer
left
和right
, 其中right
用來擴充 window, 而left
用來收縮 window
- 若
window
中的元素不包含t
, 則right
不斷向右移動, 直到window
中每種元素的個數 ≥t
中對應元素的個數left
會不斷收縮, 並更新 res, 直到當window
中某種元素的個數 <t
中該種元素的個數
have
用來記錄符合window 中某一種元素的個數 == t 中該種元素的個數
之元素個數need
則是記錄t
中有多少種元素- 若
have == need
代表window
中每種元素的個數 ≥t
中對應元素的個數e.g.
s = "ADOBECODEBANC"
,t = "ABC"
s
第一次包含t
之 substring 為ADOBEC
➔ left = 0, right = 5, curLen = 6, resLen = 6- 將左邊之
A
pop 掉後,DOBEC
並不包含t
, 因此跳出 while loop, 讓right
繼續右移, 直到 substring 為DOBECODEBA
➔ left = 1, right = 10, curLen = 10, resLen = 6- 將左邊之
D
、O
、B
、E
pop 掉後, 此時 substring 為CODEBA
➔ left = 5, right = 10, curLen = 6, resLen = 6- 將左邊之
C
pop 掉後,ODEBA
並不包含t
, 因此跳出 while loop, 讓right
繼續右移, 直到 substring 為ODEBANC
➔ left = 6, right = 12, curLen = 7, resLen = 6- 將左邊之
O
、D
、E
pop 掉後, substring 為BANC
➔ left = 9, right = 12, curLen = 4, resLen = 4- 將左邊之
B
pop 掉後,ANC
並不包含t
, 因此跳出 while loop, 但right
已到結尾, 無法再右移, 故返回BANC
class Solution { |
- time:$O(n)$ ➔ 每個 char 最多被拜訪兩次(
left
,right
) - space:$O(1)$ ➔
window
、cntT
長度不超過52
(大、小寫各26
)
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論