#include <climits>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @param t string字符串 
     * @return string字符串
     */
    bool judge(map<char,int> t, map<char,int> s)\
    {
        for(auto it=t.begin(); it!=t.end(); ++it)
        {
            if(it->second>s[it->first])
                return false;
        }

        return true;
    }

    string minWindow(string s, string t) {
        // write code here

        map<char,int> t_s, t_t;

        for(auto ch:t)
            ++t_t[ch];

        int min_len = INT_MAX;
        int left=0, right=0;
        int len = s.size();
        int start = 0;
        
        while(right<len)
        {
            if(t_t[s[right]]>0)
            {
                ++t_s[s[right]];
            }
            ++right;
            while(judge(t_t, t_s))
            {
                if(right-left+1<min_len)
                {
                    min_len = right-left+1;
                    start = left;
                }

                if(t_t[s[left]])
                    --t_s[s[left]];
                
                ++left;
            }
        }

        return min_len==INT_MAX ? "" : s.substr(start,min_len);
    }
};