一、题目
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
注意:
对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。如果 s 中存在这样的子串,我们保证它是唯一的答案。
二、示例
示例一:
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
示例二
输入:s = "a", t = "a"
输出:"a"
三、解题思路
这题维护一个移动滑块,首先先移动右滑块保证字符串t中可以全部覆盖
然后不断的移动左滑块,当不满足条件时,然后再去移动右滑块。
四、代码展示
/**
* @param {string} s
* @param {string} t
* @return {string}
*/
var minWindow = function (s, t) {
let map = new Map()
let needType = 0
for (let i = 0; i < t.length; i++) {
if (map.has(t[i])) {
map.set(t[i], map.get(t[i]) + 1)
} else {
map.set(t[i], 1)
needType += 1
}
}
let left = 0;
let right = 0;
let res = ""
while (right < s.length) {
let curR = s[right]
if (map.has(curR)) {
map.set(curR, map.get(curR) - 1)
if (map.get(curR) === 0) {
needType -= 1
}
}
while (needType === 0) {
let curStr = s.substr(left, right - left + 1)
let curL = s[left]
if (!res || res.length > curStr.length) {
res = curStr
}
if (map.has(curL)) {
map.set(curL, map.get(curL) + 1)
if(map.get(curL) === 1) {
needType += 1
}
}
left++
}
right++
}
return res
};
五、总结
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_47450807/article/details/123280683
内容来源于网络,如有侵权,请联系作者删除!