给你一个字符串 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 由英文字母组成
进阶:你能设计一个在 o(n) 时间内解决此问题的算法吗?
2. 题解
import collections
import sys
classSolution:defminWindow(self, s:str, t:str)->str:iflen(s)<len(t):return""
need = collections.defaultdict(int)# 字符串T需要的字段
window = collections.defaultdict(int)# 实际情况# 统计需要的字符和对应的数量for c in t:
need[c]+=1
left, right =0,0
valid =0
start, length =0, sys.maxsize
while right <len(s):# 增大窗口
c = s[right]
right +=1# 判断当前进入窗口的字符是否是需要的字符 如果是则更新window中的对应情况if need.get(c):
window[c]+=1# 若window中的这个字符数量已经满足需求 合法的字符数量valid增加1if need[c]== window[c]:
valid +=1# 合法的字符数量 == 需要的字符个数 满足收缩窗口的条件while valid ==len(need):# 更新结果,优化可行解if right - left < length:
start = left
length = right - left
# 缩小窗口
d = s[left]
left +=1if need.get(d):if need[d]== window[d]:
valid -=1
window[d]-=1return""if length == sys.maxsize else s[start: start + length]