力扣刷题:无重复字符的最长子串

题目

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

示例 1:

输入: s = "abcabcbb"

输出: 3

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。注意 "bca" 和 "cab" 也是正确答案。

示例2:

输入: s = "bbbbb"

输出: 1

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

示例3:

输入: s = "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。

请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

解析

这道题的解题思路就是双指针法,也可以叫做滑动窗口,开始的时候设置两个指针:left、right,设置length记录当前的长度,设置maxLength记录最长的长度,最后需要把maxLength返回,也就是答案

初始化:

length、maxLength、left、right全部为0

设置一个set集合,因为set集合里面不会出现重复的值
双指针执行步骤:

  1. 如果set集合中没有right指针指向的字符,就往set集合中添加,length与maxLength也随之改变,right也要往后移
  2. 如果set集合中存在right指针指向的字符,就遍历set集合,然后从set集合中删除掉left指针指向的字符,随后left向后移动,length减一,直到在set集合中找不到right指向的字符,此时将right指向的字符添加到set集合中去,随后length加一,right往后移动
  3. 上述过程重复直到right要等于字符串的长度时,最后返回maxLength

具体代码:

javascript 复制代码
/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    let left=right=length=maxLength = 0
    let set = new Set()
    while(right < s.length){
        if(!set.has(s[right])){
            set.add(s[right])
            length++
            if(length>maxLength){
                maxLength = length
            }
            right++
        } else {
            while(set.has(s[right])){
                set.delete(s[left])
                left++
                length--
            }
            set.add(s[right])
            length++
            right++
        }
    }
    return maxLength
};
相关推荐
小小的橙菜吖!6 小时前
联合体的学习
学习·算法
NPE~6 小时前
面试高频——分布式事务详解
分布式·面试·职场和发展·程序员·事务·分布式事务
Xing_ke3097 小时前
3D点云分割与检测(后续更新)
算法·3d点云
4311媒体网7 小时前
C语言实现简单的二分查找算法
c语言·开发语言·算法
持续学习的程序员+17 小时前
π RL(piRL)算法支持用强化学习方法训练π 0/π 0.5(pi0/pi0.5)
算法
csuzhucong7 小时前
112魔方、113魔方、114魔方
算法
无限进步_7 小时前
C语言实现贪吃蛇游戏详解
c语言·开发语言·数据结构·c++·后端·算法·游戏
Element_南笙7 小时前
吴恩达新课程:Agentic AI(笔记11)
大数据·人工智能·笔记·算法·机器学习
handsomezqh7 小时前
洛谷U611548 助教的比拼
c++·算法