# 思路:
### 1右移右指针 直至窗口全覆盖子串
### 2右移左指针 缩小窗口,并不断地检查窗口是否覆盖子串,
### 3如果是的话,就更新起始位置strStart和窗口长度
### 4如果不是的话,就右移右指针right,重复1操作
### 最后根据起始位置strStart和窗口长度windowLength来输出最短字符串
class Solution:
def minWindow(self, S, T):
# write code here
if len(S) < len(T):
return ""
# 把T中的所有字符串全部存入数组中去
hashmap = {}
for c in T:
hashmap[c] = hashmap.setdefault(c, 0) + 1 # need = {字符:出现次数}
# 定义窗口的左右边界
left = 0
right = 0
# 定义满足条件的起始位置和窗口长度:
strStart = 0
windowLength = len(S) + 1
# 定义检查函数:检查窗口是否吧字符串t全部覆盖了,如果map中的值全都不大于0,则全部覆盖了。
# hashmap的values表示表示需要的key是多少,值大于零:需要1个,如果小于0表示窗口的key已经充足了,不再需要了。
# hashmap中key:valuse=表示key需要values个。
def check(map1):
for i in map1.values():
if i > 0:
return False
return True
while right < len(S):
# 记录右指针的位置的字符
rightChar = S[right]
# 如果右指针的字符存在于hashmap中,就减1
if rightChar in hashmap:
hashmap[rightChar] -= 1
# 记录之后右指针向右移动
right += 1
# 检查窗口是否吧t中的字符全部覆盖了,全部覆盖了,那么窗口的左指针就要向右移动
while check(hashmap):
# 如果现在的窗口比之前的小,就要更新窗口的长度和起始位置
if right - left < windowLength:
windowLength = right - left
strStart = left
# 移除窗口中最左边的元素,缩小窗口
# 既然要把最左边的元素删了,那么就要把最左边的元素从hashmap中添加上,然后再去check(map)还是不是全覆盖了。
leftChar = S[left]
# 如果在其中,那么下次一定会更新右指针了。
if leftChar in hashmap:
hashmap[leftChar] += 1
left += 1
if windowLength != len(S) + 1:
return S[strStart:strStart + windowLength]
return ""