最小覆蓋子串

2021-10-01 09:51:33 字數 1834 閱讀 2286

題目:

給你乙個字串 s、乙個字串 t,請在字串 s 裡面找出:包含 t 所有字母的最小子串。

示例:輸入: s = "adobecodebanc", t = "abc"

輸出: "banc"

說明:如果 s 中不存這樣的子串,則返回空字串 ""。

如果 s 中存在這樣的子串,我們保證它是唯一的答案。

思路:參考大佬的解題思路,超級清晰:

採用類似滑動視窗的思路,即用兩個指標表示視窗左端left和右端right。 向右移動right,保證left與right之間的字串足夠包含需要包含的所有字元, 而在保證字串能夠包含所有需要的字元條件下,向右移動left,保證left的位置對應為需要的字元,這樣的 視窗才有可能最短,此時只需要判斷當期視窗的長度是不是目前來說最短的,決定要不要更新minl和minr(這兩個 變數用於記錄可能的最短視窗的端點)

搞清楚指標移動的規則之後,我們需要解決幾個問題,就是怎麼確定當前視窗包含所有需要的字元,以及怎麼確定left的 位置對應的是需要的字元。 這裡我們用乙個字典mem儲存目標字串t中所含字元及其對應的頻數。比如t="abac",那麼字典mem=, 只要我們在向右移動right的時候,碰到t中的乙個字元,對應字典的計數就減一,那麼當字典這些元素的值都不大於0的時候, 我們的視窗裡面就包含了所有需要的字元;但判斷字典這些元素的值都不大於0並不能在o(1)時間內實現,因此我們要用乙個變數 來記錄我們遍歷過字元數目,記為t_len,當我們遍歷s的時候,碰到字典中存在的字元且對應頻數大於0,就說明我們還沒有找到 足夠的字元,那麼就要繼續向右移動right,此時t_len-=1;直到t_len變為0,就說明此時已經找到足夠的字元保證視窗符合要求了。

所以接下來就是移動left。我們需要移動left,直到找到目標字串中的字元,同時又希望視窗盡可能短,因此我們就希望找到的 left使得視窗的開頭就是要求的字串中的字元,同時整個視窗含有所有需要的字元數量。注意到,前面我們更新字典的時候, 比如字元"a",如果我們視窗裡面有10個a,而目標字串中有5個a,那此時字典中a對應的計數就是-5,那麼我要收縮視窗又要保證 視窗能夠包含所需的字元,那麼我們就要在收縮視窗的時候增加對應字元在字典的計數,直到我們找到某個位置的字元a,此時字典中 的計數為0,就不可以再收縮了(如果此時繼續移動left,那麼之後的視窗就不可能含有a這個字元了),此時視窗為可能的最小視窗,比較 更新記錄即可。

**:

from collections import defaultdict

class solution:

def minwindow(self, s: str, t: str) -> str:

left ,right=0,0#滑動視窗左右兩邊指標

minstar,minend=0,len(s)#記錄當前最短視窗的端點

t_len=len(t)#統計字典中的字元是否都被搜尋過

dic= defaultdict(int)

for i in t:

dic[i]+=1

for right,item in enumerate(s):

#列出s的每個字元,以及字元的下標

if dic[item]>0:

t_len-=1

dic[item]-=1

if t_len==0:

while dic[s[left]]<0:

dic[s[left]]+=1

left+=1

if right-leftminstar,minend=left,right

dic[s[left]]+=1

t_len+=1

left+=1

return "" if minend==len(s) else s[minstar:minend+1]

最小覆蓋子串

給你乙個字串 s 乙個字串 t,請在字串 s 裡面找出 包含 t 所有字母的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 說明 如果 s 中不存這樣的子串,則返回空字串 如果 s 中存在這樣的子串,我們保證它是唯一的答案。滑動視窗。設定left,right兩個游標...

最小覆蓋子串

描述 給你乙個字串 s 乙個字串 t,請在字串 s 裡面找出 包含 t 所有字母的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 說明 如果 s 中不存這樣的子串,則返回空字串 如果 s 中存在這樣的子串,我們保證它是唯一的答案。實現 class solution ...

最小覆蓋子串

leetcode 給你乙個字串 s 乙個字串 t,請在字串 s 裡面找出 包含 t 所有字元的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 說明 如果 s 中不存這樣的子串,則返回空字串 如果 s 中存在這樣的子串,我們保證它是唯一的答案。思路和 參考鏈結 滑動視...