字典 - 使用场景
最小覆盖子串(leetcode - 76)
给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。
示例
输入:s = "ADOBECODEBANC", t = "ABC"
输出:"BANC"
思路
- 用双指针维护一个滑动窗口
- 遍历t,将t中的数据放入Map中,key表示元素,value表示元素出现的次数
- 移动右指针,如果当前元素在Map中,则将当前元素在Map映射的value减去1
- 当Map中所有的key对应的value为0时,更新当前滑动窗口的子串
- 移动左指针,如果左指针划过的地方有元素在Map中,则停止滑动左指针,重复3之后的步骤,直至找出最小的子串。
var minWindow = function(s, t) {
if(s.length < t.length) {
return '';
}
let l = 0;
let r = 0;
const map = new Map();
for(let k of t) {
map.set(k, map.has(k) ? map.get(k) + 1 : 1);
}
let mapSize = map.size;
let res = ''
for(let i = 0; i< s.length; i++) {
const c = s[r];
if(map.has(c)) {
map.set(c, map.get(c) - 1)
if(map.get(c) === 0) {
mapSize--;
}
}
while(mapSize === 0) {
const newRes = s.substring(l, r + 1);
if(!res || newRes.length < res.length) {
res = newRes;
}
const c2 = s[l];
if(map.has(c2)){
map.set(c2, map.get(c2) + 1);
if(map.get(c2) === 1) {
mapSize++;
}
}
l++;
}
r++;
}
return res;
};
點擊查看更多內容
為 TA 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦