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
andt
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) : '';
};