給你乙個字串 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...