76. 最小覆盖子串
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
注意:
- 对于
t中重复字符,我们寻找的子字符串中该字符数量必须不少于t中该字符数量。 - 如果
s中存在这样的子串,我们保证它是唯一的答案。
示例 1:
输入: s = "ADOBECODEBANC", t = "ABC"
输出: "BANC"
示例 2:
输入: s = "a", t = "a"
输出: "a"
示例 3:
输入: s = "a", t = "aa"
输出: ""
解释: t 中两个字符 'a' 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。
提示:
1 <= s.length, t.length <= 105s和t由英文字母组成
/**
* @param {string} s
* @param {string} t
* @return {string}
*/
var minWindow = function(s, t) {
if (s.length < t.length) {
return '';
}
const tMap = {};
for (const ch of t) {
tMap[ch] = (tMap[ch] || 0) + 1;
}
const sMap = {};
let result = '';
for (let left = 0, right = 0; right < s.length; right++) {
sMap[s[right]] = (sMap[s[right]] || 0) + 1;
while (left <= right && !tMap[s[left]] || sMap[s[left]] > tMap[s[left]]) {
sMap[s[left]]--;
left++;
}
let contain = true;
Object.keys(tMap).forEach(key => {
if (!sMap[key] || sMap[key] < tMap[key]) {
contain = false;
}
});
if (contain && (result.length > right - left + 1 || result.length === 0 )) {
result = s.substring(left, right + 1);
}
}
return result;
};