import java.util.*;


public class Solution {
    /**
     * 滑动窗口
     * @param S string字符串 
     * @param T string字符串 
     * @return string字符串
     */
    public String minWindow (String S, String T) {
        // write code here
        int tLen=T.length(),sLen=S.length();
        //T的长度比S大直接返回
        if(tLen>sLen){return "";}
        //tMap记录T中所有字符的数量
        Map<Character,Integer> tMap=new HashMap<>();
        for(int i=0;i<tLen;i++){
            char c=T.charAt(i);
            tMap.put(c,tMap.getOrDefault(c,0)+1);
        }
        //左右指针
        int l=0,r=0,valid=0,size=tMap.size(),tl=0,tr=10001;
        Map<Character,Integer> sMap=new HashMap<>();
        while(r<sLen){
            char c=S.charAt(r);
            if(tMap.containsKey(c)){
                int freq=sMap.getOrDefault(c,0)+1;
                sMap.put(c,freq);
                //如果sMap和tMap的数量一致,说明满足一个字母的数量相等
                if(freq==tMap.get(c)){
                    valid++;
                }
                //如果所有字母数量都相等,移动左指针
                while(l<=r&&valid==size){
                    char cl=S.charAt(l);
                    if(sMap.containsKey(cl)){
                        int cFreq=sMap.get(cl);
                        //左指针移动到tMap和sMap的字母数量一致时,即将不满足题目条件
                        if(cFreq==tMap.get(cl)){
                            //比较临时变量左右距离和现在左右指针的距离
                            if(tr-tl>r-l){
                                tl=l;
                                tr=r+1;
                            }
                            valid--;
                        }
                        sMap.put(cl,cFreq-1);
                    }
                    l++;
                }
            }
            r++;
        }
        return tr-tl==10001?"":S.substring(tl,tr);
    }
}