解题思路

哈希表+双指针---窗口滑动问题

  • 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
};