最小覆蓋子串(Leetcode困難題,python解決)

題目描述:

解決思路:滑動窗口

1. 初始,left指針和right指針都指向S的第一個元素.
2. right指針右移,擴張窗口,直到得到一個可行窗口,亦即包含TT的全部字母的窗口。
3. 得到可行的窗口後,將left指針逐個右移,若得到的窗口依然可行,則更新最小窗口大小。
4. 若窗口不再可行,則跳轉至 2
 

代碼實現如下:

class Solution(object):
    def minWindow(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: str
        """
        dict_t = collections.Counter(t) #對t中的字母計數
        required = len(dict_t) #獲得dict_t的長度
        l, r = 0, 0 #初始化窗口
        formed = 0 #用來追蹤在當前窗口中出現的t中的字母的個數(重複的字母只計數一次)
        window_counts = {} #
        ans = float("inf"), None, None
        while r < len(s):
            #從右邊開始增加字母到窗口
            character = s[r]
            window_counts[character] = window_counts.get(character, 0) + 1
            #判斷該字母是否滿足題目要求
            if character in dict_t and window_counts[character] == dict_t[character]:
                formed += 1
            while l <= r and formed == required:
                character = s[l]
                #對當前最小的窗口大小進行保存
                if r - l + 1 < ans[0]:
                    ans = (r -l + 1, l , r)
                #窗口左指針右移
                window_counts[character] -= 1
                if character in dict_t and window_counts[character] < dict_t[character]:
                    formed -= 1
                l += 1
            r += 1
        return "" if ans[0] == float("inf") else s[ans[1] : ans[2] + 1]

提交結果:

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章