「LeetCode」03-无重复字符的最长子串⚡️

1,281 阅读2分钟

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

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

题目🦀

  • 3. 无重复字符的最长子串

    难度中等

    给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

    示例 1:

    输入: s = "abcabcbb"
    输出: 3 
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
    

    示例 2:

    输入: s = "bbbbb"
    输出: 1
    解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
    

    示例 3:

    输入: s = "pwwkew"
    输出: 3
    解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
         请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
    

    示例 4:

    输入: s = ""
    输出: 0
    

    提示:

    • 0 <= s.length <= 5 * 104

    • s 由英文字母、数字、符号和空格组成

解题思路🌵

  • 先找出所有的不包含重复字符的子串

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

  • 用双指针维护一个滑动窗口,用来剪切子串。

  • 不断移动右指针,遇到重复字符,就把左指针移动到重复字符的

源码🔥

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
  //初始化左指针
    let l=0;
  //初始化右指针
    let res=0;
  //这个map用来存放是有有重复的字符
    const map=new Map()
    //遍历字符,滑动右指针
    for (let r=0;r<s.length;r++){
      
//遇到有重复的字符,并且重复字符是在滑动窗口内,移动左指针
      if(map.has(s[r])&&map.get(s[r])>=l){
            l=map.get(s[r])+1;
        }
      // 保存最大值
        res=Math.max(res,r-l+1);
        map.set(s[r],r);
    }
    return res;
};

时间复杂度:O(n)

空间复杂度:O(m),m是字符串中不重复字符的个数

结束语🌞

那么鱼鱼的LeetCode算法篇的Leetcode03-无重复字符的最长子串就结束了,算法这个东西没有捷径,只能多写多练,多总结,文章的目的其实很简单,就是督促自己去完成算法练习并总结和输出,菜不菜不重要,但是热爱🔥,喜欢大家能够喜欢我的短文,也希望通过文章认识更多志同道合的朋友,如果你也喜欢折腾,欢迎加我好友,一起沙雕,一起进步

github🤖:sudongyu

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

vx👦:sudongyuer

写在最后

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