76 最小覆蓋子串!!(滑動視窗)

2021-09-26 10:52:32 字數 2042 閱讀 9949

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

示例:

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

輸出: "banc"

說明:

【困難】

【分析】滑動視窗法。

外迴圈 right

內迴圈 left

當外迴圈迴圈到count==count_n and left<=right時,才進內迴圈

res=(start-end+1的長度,left,right)

dict_t 記錄t中各字母出現的次數

count_n 記錄t中不重複字母的個數 ,比如t=「abcdd」,count_n=4

字元char →先對right外迴圈

dic_window 記錄視窗內該字母出現的次數

count 記錄 如果字母出現的次數一旦達到dict_t中滿足的情況時+1(當count記錄的次數等count_n時,說明出現一段視窗滿足總情況了。進入內迴圈再作處理)

進入內迴圈,對大視窗進行收縮:

char →對left內迴圈

end記錄相應right的char在s中的下標

start記錄相應left的char在s中的下標

如果視窗長度小於已知記錄的長度,則重新整理記錄res:(start-end+1,start,end)

dic_window[char]-1 視窗向內收縮

視窗收縮時同時記錄count :當dic_window[char] < dict_t[char]時

當count!=count_n and left>right時,跳出內迴圈,此時res已經記錄下符合題意的最小長度的end-start+1了。

然後再作外迴圈…

總體思路:先對right作迴圈當視窗滿足覆蓋t的字串時,進入內迴圈對left作迴圈,視窗向內收縮找到最小長度的覆蓋子串。

from collections import counter

class solution(object):

def minwindow(self, s, t):

""":type s: str

:type t: str

:rtype: str

"""if not t or not s:

return ""

if len(t)>len(s):

return ""

dic_t=counter(t)

count_n=len(dic_t)

s_lst=

for i,char in enumerate(s):

if char in t:

res=float("inf"),0,0

left,right=0,0

dic_window={}

count=0

while right:統計字元出現的個數,返回字典:

from collections import counter

t="abac"

dic_t=counter(t)

t="abac"

dic_t={}

for i in t:

dic_t[i]=dic_t.get(i,0)+1

注2:一開始也想到說把t中的單詞凡是在**現的位置取出來,但是沒有聯想到滑窗的方法,一開始也只是取出來的位置放在乙個dict中,這樣應該也能做出來,以後可以想想怎麼做:

s = "adobecodebanc"; t = "abc"

from collections import defaultdict

dic_s=defaultdict(list)

for i,char in enumerate(s):

if char in t:

dic_s=defaultdict(list, ),這個或者可以用最小路徑來做?

力扣 76 最小覆蓋子串 滑動視窗

思路 滑動視窗,搞兩個指標l r 0l r 0 l r 0,把r rr右移直到滿足題意,然後再把l ll右移直到不滿足題意,這時記錄一下最小值,重複這個過程即可。class solution siz s.size int l 0,r 0 string ans while rif ct return ...

滑動視窗 LeetCode76 最小覆蓋子串

給你乙個字串 s 乙個字串 t 請你設計一種演算法,可以在 o n 的時間複雜度內,從字串 s 裡面找出 包含 t 所有字元的最小子串。輸入 s adobecodebanc t abc 輸出 banc 左右指標輪流前進,視窗大小增增減減,視窗不斷向右滑動 最短子串開始位置和長度 start 0 mi...

leetcode76 最小覆蓋子串 滑動視窗

題目 思路 滑動視窗 使用new int 128 陣列儲存t中每個字元出現的次數 使用new int 128 陣列儲存視窗中每個字元出現的次數 使用minlength表示最小子串長度。使用count記錄目前視窗中的有效字元數,當count t.length 時,視窗長度為乙個包含t中所有字元的子串的...