<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:
    bool containsAllChars(unordered_map<char, int>& mpT,
                          unordered_map<char, int>& mpS) {
        for (auto entry : mpT) {
            if (mpS.find(entry.first) == mpS.end() ||
                mpS[entry.first] < entry.second)
                return false;
        }
        // cout<<" loll"<<endl;
        return true;
    }
    string minWindow(string s, string t) {
        if (t.length() > s.length())
            return "";
        unordered_map<char, int> mpT, mpS;
        int left = 0, right = 0, result = INT_MAX, final_left = -1, final_right = -1;
        for (auto ch : t) {
            if (mpT.find(ch) == mpT.end()) {
                mpT.insert({ch, 1});
            } else {
                mpT[ch]++;
            }
        }
        while (right <= s.length() && left<s.length()) {
            // cout << left << " " << right << endl;
            if (containsAllChars(mpT, mpS)) {
                if (right - left < result) {
                    // cout<<" hehe"<<endl;
                    result = right - left;
                    final_left = left;
                    // final_right = right-1;
                }
                if (mpS[s[left]] == 1) {
                    mpS.erase(s[left]);
                } else {
                    mpS[s[left]]--;
                }
                left++;
            } else if(right<s.length()){
                if (mpS.find(s[right]) == mpS.end()) {
                    mpS.insert({s[right], 1});
                } else {
                    mpS[s[right]]++;
                }
                right++;
            } else{
                break;
            }
        }
        if (final_left == -1)
            return "";
        else {
            return s.substr(final_left, result);
        }
    }
};
11300