题解 | #双指针-哈希表-最小覆盖子串#
最小覆盖子串
http://www.nowcoder.com/practice/c466d480d20c4c7c9d322d12ca7955ac
解题思路
哈希表+双指针---窗口滑动问题
- 1,map记录目标子串中需要的字符和相应的个数。
- 2,右指针滑动的时候,检查是否是所需需要的,是需要的就修改map中的所需个数。
- 3,找到所需的子串的时候,就与上次找到的进行比较,更短则更新,这时候考虑左指针的移动,如果左指针指向的字符是所需要的,需要将该字符的所需数量进行加一;此时,右指针移动的时候也要找到对应的字符。
/**
*
* @param S string字符串
* @param T string字符串
* @return string字符串
*/
function minWindow( S , T ) {
// write code here
let l = 0, r = 0;
const map = new Map();
let lent = T.length;
let lens = S.length;
for(let i = 0;i<lent;i++){
map.set(T[i],map.has(T[i]) ? map.get(T[i])+1 : 1);
}
let len = map.size;
let res = '';
while(r<lens){
const nowc = S[r];
if(map.has(nowc)){
map.set(nowc,map.get(nowc)-1);
if(map.get(nowc)==0){
len--;
}
}
while(len === 0){
let newstr = S.slice(l,r+1);
if(!res || res.length > newstr.length) res = newstr;
let nowl = S[l];
if(map.has(nowl)){
map.set(nowl,map.get(nowl)+1);
if(map.get(nowl)===1){
len++;
}
}
l++;
}
r++;
}
return res;
}
module.exports = {
minWindow : minWindow
};