JavaScript实现最小覆盖子串--力扣(leetcode 76题)

目录

1 问题

2 输入输出

3 解答 滑动窗口

4 代码


1 问题

https://leetcode-cn.com/problems/minimum-window-substring/

给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。

2 输入输出

示例:

输入: S = "ADOBECODEBANC", T = "ABC"

输出: "BANC"

说明:

如果 S 中不存这样的子串,则返回空字符串 ""。

如果 S 中存在这样的子串,我们保证它是唯一的答案。

3 解答 滑动窗口

使用一层for来滑动窗口,使用map存储t中字符的需求,使用missingType ===0来确认是否有符合的子串。其中mapmissingType关联。

4 代码

/**
 * @param {string} str
 * @param {string} t
 * @return {string}
 * 功能:最小覆盖子串
 * 方法:滑动窗口
 */
var minWindow = function(str, t) {
    if(t.length === 0 || str.length === 0){ //t放在前面,无论如何都会判断其长度是否为0
        return "";
    }
    let len = str.length;
    let subStart = len + 1; //最符合的子串的起点,开始大于str长度,如果没有符合的,那么截取到空字符串
    let minLength = len + 1;  //长度最小值,初始为str长度加1,尽量大,然后有符合的就会变更
    let missType = 0;//缺失的种类
    let map = new Map();//用来存储t中字符,以及缺失度
    for(let i = 0; i < t.length; i++){ //t字符串中个字符出现的位置
        if(map.has(t[i])){ //如果存在,那么增加1
            let value = map.get(t[i]) + 1;
            map.set(t[i], value);
        }else {  //如果不存在,那么设置为1
            map.set(t[i], 1);
            missType++;
        }
    }
    for(let start = 0, end = 0; start <= end && end < len; end++){ //end遍历字符串,从左往右一格一格遍历
        if(map.has(str[end])){ //end对应的字符在t中出现过
            let value = map.get(str[end]) - 1;//出现过,则减1
            map.set(str[end], value);
        }
        if(map.get(str[end]) === 0){ //只有等于0时,缺失种类减1
            missType--;
        }
        while(missType === 0){ //只要缺少种类为0,取得符合的start和end,然后滑动窗口等
            let length = end - start + 1;//获得符合子串的长度
            if(length < minLength){ //有较优子串,更新子串起点subStart
               minLength = length;
               subStart = start;
            }
            //左指针右移,处理左指针。比较左指针的字符,如果在map中出现,则做以下改动
            if(map.has(str[start])){ //start对应的字符在t中出现过
                let value = map.get(str[start]) + 1;//出现过,则需求加1
                map.set(str[start], value);
            }
            if(map.get(str[start]) > 0){ //只有等于0时,缺失种类减1
                missType++;
            }
            start++; //左指针右移一位
        }
    }
    console.log(subStart, minLength);
    return str.substr(subStart, minLength);
};
console.log(minWindow(str = "a" , t = "aa"));

参考:力扣

百里于2020年5月24日

如果有错,请您指出!如有侵权,请联系我删除!

你可能感兴趣的:(#,双指针,#,力扣top,#,滑动窗口)