给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
注意:
对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。
示例 1:
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
示例 2:
输入:s = "a", t = "a"
输出:"a"
示例 3:
输入: s = "a", t = "aa"
输出: ""
解释: t 中两个字符 'a' 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。
提示:
1 <= s.length, t.length <= 105
s 和 t 由英文字母组成
题解:
这道题主要通过滑动窗口+字符计数进行解决,搞了好久,之前用count来计数,但是超时了,卡在最后一个用例,(最后一个用例超级长),所以重新优化下,终于通过了。
class Solution:
def minWindow(self, s: str, t: str) -> str:
if len(s)<len(t):
return ""
else:
left=0
n=len(s)
length=n+1
lt=len(t)
i=lt-1
result=''
dict=self.co(t)
dics=self.co(s[0:lt])
while i<n:
ans=s[left:i+1]
if len(ans)<lt:
i+=1
if i<n:
dics[s[i]]+=1
elif self.fun(dict,dics):
if length>len(ans):
result=ans
length=len(ans)
dics[s[left]]-=1
left=left+1
else:
i+=1
if i<n:
dics[s[i]]+=1
return result
def fun(self,dict,dics):
for i in dict:
if i not in dics or dict[i]>dics[i]:
return False
return True
def co(self,mm):
dict={}
x="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
for i in x:
if i not in dict:
dict[i]=0
for i in mm:
dict[i]+=1
return dict