題目描述:
給你一個字符串 S、一個字符串 T,請在字符串 S 裏面找出:包含 T 所有字符的最小子串。
示例:
輸入: S = "ADOBECODEBANC", T = "ABC"
輸出: "BANC"
解題思路:
對於可變窗口,我們同樣固定初始化左右指針 l 和 r,分別表示的窗口的左右頂點。後面有所不同,我們需要保證:
- l 和 r 都初始化爲 0
- r 指針移動一步
- 判斷窗口內的連續元素是否滿足題目限定的條件
如果滿足,再判斷是否需要更新最優解,如果需要則更新最優解。並嘗試通過移動 l 指針縮小窗口大小。循環執行 4.1
如果不滿足,則繼續。 - 形象地來看的話,就是 r 指針不停向右移動,l 指針僅僅在窗口滿足條件之後纔會移動,起到窗口收縮的效果。
代碼:
from collections import Counter
from collections import defaultdict
class Solution:
def minWindow(self, s: str, t: str) -> str:
l = 0
ans = s + s
n = len(s)
target = Counter(t)
counter = defaultdict(lambda: 0)
def contains(counter, target):
if len(counter) < len(target):
return False
for k in counter:
if k not in target or counter[k] < target[k]:
return False
return True
for r in range(n):
if s[r] in target:
counter[s[r]] += 1
while l < n and contains(counter, target):
if r - l + 1 < len(ans):
ans = s[l:r + 1]
if s[l] in target:
counter[s[l]] -= 1
l += 1
return "" if ans == s + s else ans
參考鏈接:
題目來源: