# 思路:
### 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 ""