<p>Given two strings <code>s</code> and <code>t</code> of lengths <code>m</code> and <code>n</code> respectively, return <em>the <strong>minimum window</strong></em> <span data-keyword="substring-nonempty"><strong><em>substring</em></strong></span><em> of </em><code>s</code><em> such that every character in </em><code>t</code><em> (<strong>including duplicates</strong>) is included in the window</em>. If there is no such substring, return <em>the empty string </em><code>&quot;&quot;</code>.</p>

<p>The testcases will be generated such that the answer is <strong>unique</strong>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;ADOBECODEBANC&quot;, t = &quot;ABC&quot;
<strong>Output:</strong> &quot;BANC&quot;
<strong>Explanation:</strong> The minimum window substring &quot;BANC&quot; includes &#39;A&#39;, &#39;B&#39;, and &#39;C&#39; from string t.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;a&quot;, t = &quot;a&quot;
<strong>Output:</strong> &quot;a&quot;
<strong>Explanation:</strong> The entire string s is the minimum window.
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;a&quot;, t = &quot;aa&quot;
<strong>Output:</strong> &quot;&quot;
<strong>Explanation:</strong> Both &#39;a&#39;s from t must be included in the window.
Since the largest window of s only has one &#39;a&#39;, return empty string.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>m == s.length</code></li>
	<li><code>n == t.length</code></li>
	<li><code>1 &lt;= m, n &lt;= 10<sup>5</sup></code></li>
	<li><code>s</code> and <code>t</code> consist of uppercase and lowercase English letters.</li>
</ul>

<p>&nbsp;</p>
<p><strong>Follow up:</strong> Could you find an algorithm that runs in <code>O(m + n)</code> time?</p>

class Solution {
public:
    string minWindow(string s, string t) {
        int n=s.length();
        map<char,int>map_t_str;
        for(auto it:t)
            map_t_str[it]++;
        
        string res="";
        if(t.length()==1){
            for(auto it:s){
                if(it==t[0]){
                    return res+it;
                }
            }
            return "";
        }
        
        int mini=INT_MAX;
        map<char,int>comp;
        map<char,int>real;
        int i=0,j=0;
        while(j<n){
            if(map_t_str.find(s[j])!=map_t_str.end()){
                real[s[j]]++;
                if(comp[s[j]] < map_t_str[s[j]])
                    comp[s[j]]++;
                if(comp==map_t_str){
                    while(i<=j){
                        if(map_t_str.find(s[i])!=map_t_str.end()){
                            if(real[s[i]] == comp[s[i]])
                                break;
                            real[s[i]]--;
                        }
                        i++;
                    }
                    // cout<<endl<<"j-i+1 = "<<j-i+1<<s.substr(i,j-i+1)<<endl;
                    if(j-i+1 < mini){
                        mini=j-i+1;
                        res=s.substr(i,j-i+1);
                        // cout<<res<<" ";
                    }
                    while(i <= j){
                        if(map_t_str.find(s[i])!=map_t_str.end()){
                            real[s[i]]--;
                            if(real[s[i]] < comp[s[i]]){
                                comp[s[i]]--;
                                i++;
                                break;
                            }
                        }
                        i++;
                    }
                    while(i<=j){
                        if(map_t_str.find(s[i])!=map_t_str.end())
                            break;
                        i++;
                    }
                }
            }
            j++;
        }

        return res;
    }
};
12000