Skip to content

76. Minimum Window Substring

Description

Given two strings s and t of lengths m and n respectively, return the minimum window

of s such that every character in t (including duplicates) is included in the window. If there is no such substring, return the empty string "".

The testcases will be generated such that the answer is unique.

 

Example 1:

Input: s = "ADOBECODEBANC", t = "ABC"
Output: "BANC"
Explanation: The minimum window substring "BANC" includes 'A', 'B', and 'C' from string t.

Example 2:

Input: s = "a", t = "a"
Output: "a"
Explanation: The entire string s is the minimum window.

Example 3:

Input: s = "a", t = "aa"
Output: ""
Explanation: Both 'a's from t must be included in the window.
Since the largest window of s only has one 'a', return empty string.

 

Constraints:

  • m == s.length
  • n == t.length
  • 1 <= m, n <= 105
  • s and t consist of uppercase and lowercase English letters.

 

Follow up: Could you find an algorithm that runs in O(m + n) time?

 

Solutions

Solution: Sliding Window + Hash Map

  • Time complexity: O(m+n)
  • Space complexity: O(n)

 

JavaScript

js
/**
 * @param {string} s
 * @param {string} t
 * @return {string}
 */
const minWindow = function (s, t) {
  const targetMap = new Map();
  let minSize = Number.MAX_SAFE_INTEGER;
  let left = (current = 0);
  let minLeft = -1;

  for (const str of t) {
    const count = targetMap.get(str) ?? 0;

    targetMap.set(str, count + 1);
  }
  for (let index = 0; index < s.length; index++) {
    if (targetMap.has(s[index])) {
      const count = targetMap.get(s[index]) - 1;

      targetMap.set(s[index], count);
      if (count > -1) current += 1;
    }
    while (current === t.length) {
      if (index - left + 1 < minSize) {
        minSize = index - left + 1;
        minLeft = left;
      }
      if (targetMap.has(s[left])) {
        const count = targetMap.get(s[left]) + 1;

        targetMap.set(s[left], count);
        if (count > 0) current -= 1;
      }
      left += 1;
    }
  }
  return minLeft > -1 ? s.slice(minLeft, minLeft + minSize) : '';
};

Released under the MIT license