题目:
76.最小覆盖子串
思路:
滑动窗口。关键在于判断窗口中的字符串是否包含T中所有字母from collections import Counter
class Solution:
def minWindow(self, s: str, t: str) -> str:
def is_contained(window, t):
# dict
window = dict(window)
t = dict(t)
for t_key, t_val in t.items():
if window.__contains__(t_key):
if window[t_key] < t_val:
return False
else:
return False
return True
t = Counter(t)
left = right = 0
window = {}
min_substr = list(s)
while right < len(s):
window[s[right]] = window.get(s[right], 0) + 1
while is_contained(window, t):
if right-left+1 <= len(min_substr):
min_substr = s[left:right+1]
window[s[left]] -= 1
left += 1
right += 1
return min_substr if type(min_substr) is str else ''
超时做法
class Solution:
def minWindow(self, s: str, t: str) -> str:
def is_contained(sub_s, t):
sub_s = list(sub_s)
for c in t:
if c in sub_s[:]:
sub_s.remove(c)
else:
return False
else:
return True
left = 0
right = 0
min_substr = s
Flag = False
while right < len(s):
right += 1
while is_contained(s[left:right], t) and left < right:
print('ok')
if len(s[left:right]) <= len(min_substr):
print('fuzhi')
min_substr = s[left:right]
Flag = True
print(min_substr)
left += 1
return min_substr if Flag else ''
别人简洁的代码
class Solution:
def minWindow(self, s: str, t: str) -> str:
ans=''
l=0
minn=99999
d=Counter(t)
dd=defaultdict(int)
for i in range(len(s)):
dd[s[i]]+=1
while involve(d,dd):
if i-l<minn:
minn=i-l
ans=s[l:i+1]
dd[s[l]]-=1
l+=1
return ans
def involve(a,b):
for k,v in a.items():
if k not in b or b[k]<v:
return False
return True
作者:cpf_china
链接:https://leetcode-cn.com/problems/minimum-window-substring/solution/python3-by-cpf_china-10/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。