快樂的LeetCode --- 76. 最小覆蓋子串

題目描述:

給你一個字符串 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

參考鏈接:

fe-lucifer


題目來源:

https://leetcode-cn.com/problems/minimum-window-substring

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