76 最小覆蓋子串

2021-10-07 07:16:52 字數 4130 閱讀 6671

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

示例:

輸入: s = 「adobecodebanc」, t = 「abc」

輸出: 「banc」

說明:

如果 s 中不存這樣的子串,則返回空字串 「」。

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

class

solution

:def

minwindow

(self, s:

str, t:

str)

->

str:

n=len(s)

i=0 min_len=

len(s)

re=""while iif s[i]

in t:

temp1=

list

(t) temp1.remove(s[i]

) temp2=

[s[i]

] i+=

1 j=i

while temp1 and jif s[j]

in temp1:

temp1.remove(s[j]))

j+=1if

not temp1 and

len(temp2)

<=min_len:

min_len=

len(temp2)

re=''.join(temp2)

else

: i+=

1return re

class

solution

:def

minwindow

(self, s:

str, t:

str)

->

str:

iflen

(s)<

len(t)

:return

"" set_=

set(t)

n=len(s)

dic=

key=

0for i in

range

(n):

if s[i]

in set_:

dic[key]

=i key+=

1 tar=

list

(dic.values())

j=0 start=

0 end=

len(s)-1

re_start=

0 re_end=

len(s)-1

label=

0while j <

len(tar)

: temp1=

list

(t) temp1.remove(s[tar[j]])

start=tar[j]

end=tar[j]

j+=1 k=j

while temp1 and k<

len(tar)

:if s[tar[k]

]in temp1:

temp1.remove(s[tar[k]])

end=tar[k]

k+=1if

not temp1 and re_end-re_start>=end-start:

re_start=start

re_end=end

label=

1if label==1:

return s[re_start:re_end+1]

else

:return

""

class

solution

:def

minwindow

(self, s:

str, t:

str)

->

str:

iflen

(s)<

len(t)

:return

""from collections import defaultdict

need=defaultdict(

int)

n=len(s)

i=0for i in t:

need[i]+=1

need_count=

len(t)

map=

key=

1for i in

range

(n):

if s[i]

in t:

map[key]

=i key+=

1 i=

1 start=

0 end=

float

('inf'

)for j in

map.values():

if need[s[j]

]>0:

need_count-=

1 need[s[j]]-=

1while need_count==0:

if need[s[

map[i]]]

==0:# need_count+=1

break

need[s[

map[i]]]

+=1i+=

1if need_count==

0and j-

map[i]

<=end-start:

start=

map[i]

end=j

if need_count==0:

need[s[

map[i]]]

+=1need_count+=

1 i+=

1if end==

float

('inf'):

return

""return s[start:end+

1]

後面發現單獨把可能首尾的元素拿出來這裡無形之中多遍歷了一邊s,好像效率並不高就又改回去了。

class

solution

:def

minwindow

(self, s:

str, t:

str)

->

str:

need=collections.defaultdict(

int)

for c in t:

need[c]+=1

needcnt=

len(t)

i=0 res=(0

,float

('inf'))

for j,c in

enumerate

(s):

if need[c]

>0:

needcnt-=

1 need[c]-=1

if needcnt==0:

#步驟一:滑動視窗包含了所有t元素

while

true

:#步驟二:增加i,排除多餘元素

c=s[i]

if need[c]==0

:break

need[c]+=1

i+=1if j-i-res[0]

:#記錄結果

res=

(i,j)

need[s[i]]+=

1#步驟三:i增加乙個位置,尋找新的滿足條件滑動視窗

needcnt+=

1 i+=

1return

''if res[1]

>

len(s)

else s[res[0]

:res[1]

+1]#如果res始終沒被更新過,代表無滿足條件的結果

76 最小覆蓋子串

題目 給你乙個字串s 乙個字串t,請在字串s裡面找出 包含t所有字母的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 方法一 自己寫的,但是leetcode上超時 defminwindow s,t m 0 all in false iflen t 0or len s...

76 最小覆蓋子串

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

76最小覆蓋子串

給你乙個字串 s 乙個字串 t,請在字串 s 裡面找出 包含 t 所有字母的最小子串。示例 輸入 s adobecodebanc t abc 輸出 banc 說明 滑動視窗解法。hashmap方式 param s param t return public static string minwind...