题目:给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。
示例 1:
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
示例 2:
输入:s = "a", t = "a"
输出:"a"
提示:
1 <= s.length, t.length <= 105
s 和 t 由英文字母组成
题解代码:
class Solution: def minWindow(self, s: str, t: str) -> str: need = {} # t 中字符个数转化为dict window = {} # 记录窗口数据 # 初始化需要的结果字典 for i in t: if i in need: need[i]+= 1 else: need[i] = 1 left,right = 0,0 # 两个指针 valid = 0 # 记录有多少个符合t字符串的字符进入到了窗口中 start,lenght = 0 , float("inf") # 初始化结果, start 表示字串开始,lenght表示最短子串个数 while(right<len(s)): s_str = s[right] right += 1 if s_str not in window: window[s_str] = 1 else: window[s_str] += 1 if s_str in need: if window[s_str] == need[s_str]: # windows 中记录的个数与need 中记录的个数相等,说明这个字符已经满足条件 valid += 1 # 当valid == len(need) 之后开始left 开始右移动,减小窗口 while (valid == len(need)): if right - left < lenght : # 记录字串起始位置与长度 start = left lenght = right - left d = s[left]; left+=1 # left 右移 if d in need: if (window[d] == need[d]): # 如果移出去的字符刚好符合need 则left 右移后字串不符合条件。 valid -=1 window[d] -= 1 # 在窗口中将移出去的字符数减1 return "" if lenght == float("inf") else s[start:lenght+start]