「LeetCode」76-最小覆盖子串⚡️

1,920 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金

大家好,我是速冻鱼🐟,一条水系前端💦,喜欢花里胡哨💐,持续沙雕🌲,是隔壁寒草🌿的好兄弟,刚开始写文章。 如果喜欢我的文章,可以关注➕点赞,为我注入能量,与我一同成长吧~

题目🦀

  • 76. 最小覆盖子串

    难度困难

    给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ""

    注意:

    • 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。

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

    示例 1:

    输入:s = "ADOBECODEBANC", t = "ABC"
    输出:"BANC"
    

    示例 2:

    输入:s = "a", t = "a"
    输出:"a"
    

    示例 3:

    输入: s = "a", t = "aa"
    输出: ""
    解释: t 中两个字符 'a' 均应包含在 s 的子串中,
    因此没有符合条件的子字符串,返回空字符串。
    

    提示:

    • 1 <= s.length, t.length <= 105
    • st 由英文字母组成

解题思路🌵

  • 先找出所有包含T的子串

  • 找出长度最小那个子串,返回即可

  • 用双指针维护一个滑动窗口,用来枚举出所有的子串。

  • 不断移动右指针,找到包含T的子串,移动左指针,尽量减少包含T的子串的长度。

源码🔥

/**
 * @param {string} s
 * @param {string} t
 * @return {string}
 */
var minWindow = function(s, t) {
    let l=0;
    let r=0;
    const need =new Map();
    for(let c of t){
            need.set(c,need.has(c)?need.get(c)+1:1);
    }

    let needType=need.size;

    let res='';

    while(r<s.length){
        const c=s[r];
        if(need.has(c)){
            need.set(c,need.get(c)-1)
            if(need.get(c)===0)needType-=1;
        }
        while(needType===0){
            const newRes =s.substring(l,r+1);
            if(!res||newRes.length<res.length)res=newRes;
            const c2=s[l];
            if(need.has(c2)){
                need.set(c2,need.get(c2)+1);
                if(need.get(c2)===1)needType+=1;
            }
            l+=1;
        }
        r+=1;
    }
    return res;

};

时间复杂度:O(m+n),m是t的长度,n是s的长度。

空间复杂度:O(m)

结束语🌞

那么鱼鱼的LeetCode算法篇的76-最小覆盖子串就结束了,虽然前端对算法要求没有后端高,但是算法是编程基础,程序=数据结构➕算法,所以算法这个东西没有捷径,只能多写多练,多总结,文章的目的其实很简单,就是督促自己去完成算法练习并总结和输出,菜不菜不重要,但是热爱🔥,喜欢大家能够喜欢我的短文,也希望通过文章认识更多志同道合的朋友,如果你也喜欢折腾,欢迎加我好友,一起沙雕,一起进步

github🤖:sudongyu

个人博客👨‍💻:速冻鱼blog

vx👦:sudongyuer

写在最后

伙伴们,如果喜欢我的口水话给🐟🐟点一个赞👍或者关注➕都是对我最大的支持。