給你乙個字串 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中所有字元的子串的...