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- 將左邊之
Apop 掉後,DOBEC並不包含t, 因此跳出 while loop, 讓right繼續右移, 直到 substring 為DOBECODEBA➔ left = 1, right = 10, curLen = 10, resLen = 6- 將左邊之
D、O、B、Epop 掉後, 此時 substring 為CODEBA➔ left = 5, right = 10, curLen = 6, resLen = 6- 將左邊之
Cpop 掉後,ODEBA並不包含t, 因此跳出 while loop, 讓right繼續右移, 直到 substring 為ODEBANC➔ left = 6, right = 12, curLen = 7, resLen = 6- 將左邊之
O、D、Epop 掉後, substring 為BANC➔ left = 9, right = 12, curLen = 4, resLen = 4- 將左邊之
Bpop 掉後,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!
評論