<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 need[128] = {0}; // Array to store the frequency of characters required from 't'
        int window[128] = {0}; // Array to store the frequency of characters in the current window
        int strLength = s.size(), targetLength = t.size(); // Store the length of the strings 's' and 't'
      
        // Populate the need array with frequencies of characters in 't'
        for (char& c : t) {
            ++need[c];
        }
      
        // Initialize variables for the sliding window technique
        int matches = 0; // Number of characters that match 't' in the current window
        int start = 0; // Start index of the minimum window
        int minStart = -1; // Start index of the overall minimum window found
        int minLength = INT_MAX; // Length of the overall minimum window found
      
        // Iterate over the string 's' using 'i' as the end index of the window
        for (int i = 0; i < strLength; ++i) {
            // Include the character at the current position into the window
            ++window[s[i]];
            // If the current character is needed and the window contains enough
            // instances of it to match 't', then increment the match count
            if (need[s[i]] >= window[s[i]]) {
                ++matches;
            }
            // When all characters from 't' are found in the current window
            while (matches == targetLength) {
                // Update minimum window if the current window's length is smaller
                if (i - start + 1 < minLength) {
                    minLength = i - start + 1;
                    minStart = start;
                }
                // Exclude character at the start position from the window
                if (need[s[start]] >= window[s[start]]) {
                    --matches;
                }
                --window[s[start++]];
            }
        }
      
        // If no window was found, return an empty string. Otherwise, return the minimum window
        return minStart < 0 ? "" : s.substr(minStart, minLength);
    }
};
10400