最小覆盖子串
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。
注意: 细节很多
class Solution(object):
def minWindow(self, s, t):
"""
:type s: str
:type t: str
:rtype: str
"""
if not s:
return ""
if len(s) < len(t):
return ""
hash = collections.defaultdict(int)
need_num = len(t)
res = (0, float("inf"))
for i in t:
hash[i] += 1
i = 0
for j in range(len(s)):
if hash[s[j]] > 0:
need_num -= 1
hash[s[j]] -= 1
if need_num == 0:
while True:
if hash[s[i]] == 0:#注意这里要先判断hash[s[i]是否等于0,因为如果s[i]不是t中的元素时,hash[s[i]肯定小于0,而我们在下面又进行了i+=1的操作,此时虽然hash[s[i]](这里的s[i]不是t中的元素)等于了0,但是我们进行了+1的操作,不会再遍历到那个
break
hash[s[i]] += 1
i += 1
if j - i + 1 <= res[1] - res[0]:
res = (i, j)
hash[s[i]] += 1
i += 1
need_num += 1
return "" if res[1] > len(s) else s[res[0]:(res[1] + 1)]#"" if res[1] > len(s)是为了防止出现"a" "b"这种情况,此时res【1】==inf