int resl,resr;
string res="";
int mi = 0x3f3f3f3f;
unordered_map<char, int>ss;
unordered_map<char, int>tt;
set<char>fl;
class Solution {
  public:
    string minWindow(string S, string T) {
        for (auto x : T)tt[x]++;
        int l = 0, r = 0;
        while(r<S.length())
        {
            bool flag=false;
            char t=S[r];
            if(tt.count(t)==0)
            {
                r++;
                continue;
            }
            ss[t]++;
            if(ss[t]==tt[t])fl.insert(t);
            if(fl.size()==tt.size())flag=true;
            while(flag)
            {
                t=S[l];
                if(tt.count(t)==0)
                {
                    l++;
                    continue;
                }
                ss[t]--;
                if(ss[t]<tt[t])fl.erase(t),flag=false;
                if(mi>r-l+1)mi=r-l+1,resl=l,resr=r;
                l++;
            }
            r++;
        }
        if(mi==0x3f3f3f3f)return "";
        for(;resl<=resr;resl++)res+=S[resl];
        return res;
    }
};