题目: 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
注意:
对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如果 s 中存在这样的子串,我们保证它是唯一的答案。 题目链接
JavaScript解法
/**
* @param {string} s
* @param {string} t
* @return {string}
*/
var minWindow = function(s, t) {
let need = {};
let matched = {};
let matchedCount = 0;
for (let char of t) need[char] = (need[char] || 0) + 1;
let startIndex = 0, minLen = Number.MAX_VALUE;
let left = 0, right = 0;
while(right < s.length) {
// 增大窗口
let char = s[right];
right++;
if (need[char]) {
matched[char] = (matched[char] || 0) + 1;
if (matched[char] === need[char])
matchedCount++;
}
while(matchedCount === Object.keys(need).length) {
// 缩小窗口
if (right - left < minLen) {
startIndex = left;
minLen = right - left;
}
let d = s[left];
left++;
if (need[d]) {
if (matched[d] === need[d])
matchedCount--;
matched[d]--;
}
}
}
return minLen == Number.MAX_VALUE ? "" : s.substr(startIndex, minLen);
};
解析: 双指针滑动窗口解法
- 时间复杂度: