#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param S string字符串 
# @param T string字符串 
# @return string字符串
#
class Solution:
    def minWindow(self , S: str, T: str) -> str:
        # write code here
        if not S or not T:
            return ""
        
        count_t = {}
        for char in T:
            count_t[char] = count_t.get(char,0)+1

        count_s = {}
        l,r = 0,0
        min_length = float("inf")
        min_start = 0
        formed = 0

        while r < len(S):
            char = S[r]
            count_s[char] = count_s.get(char,0)+1
            if char in count_t and count_t[char] == count_s[char]:
                formed += 1

            while l <= r and formed == len(count_t):
                char = S[l]
                if r -l +1 < min_length:
                    min_length = r-l+1
                    min_start = l
                count_s[char] -= 1
                if char in count_t and count_s[char] < count_t[char]:
                    formed -=1
                l += 1
                
            r += 1
        if min_length == float("inf"):
            return ""
        else:
            return S[min_start:min_start+min_length]