【leetcode 76】最小覆蓋子串

滑動窗口問題,注意題幹:返回 s 中涵蓋 t 所有字符的最小子串

  1. 記錄t中的字符和頻數
  2. 使用滑動窗口遍歷s,移動右窗口,同時記錄窗口內的字符和頻數
  3. 當右窗口的字符頻數等於所需的計數,cur_len加1
  4. 當於滿足t出現的字符個數,並且是目前的最小長度,更新結果(結果可以使用一個元組來記錄)
  5. 同時要右移動左邊窗口,縮小窗口,並判斷更新記錄,直到右邊窗口達到s的最後一個字符
class Solution:
    def minWindow(self, s: str, t: str) -> str:
        l,r,ans,cur_len = 0,0,(float('inf'),0,0),0
        s_d,t_d = {},{}
        for i in t: t_d[i] = t_d.get(i,0)+1
        while r<len(s):
            s_d[s[r]] = s_d.get(s[r],0) + 1
            if s_d[s[r]] == t_d.get(s[r],0): cur_len+=1
            while l<=r and len(t_d)==cur_len:
                if r-l+1 < ans[0]: ans = (r-l+1,l,r+1)
                s_d[s[l]]-=1
                if s_d[s[l]]<t_d.get(s[l],0): cur_len-=1
                l+=1
            r+=1
        return "" if ans[0]==float("inf") else s[ans[1]:ans[2]] 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章