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

题目

给定一个字符串 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
};
相关推荐
8Qi83 小时前
回文子串(Palindromic Substrings)—— 题解
算法·leetcode·职场和发展·动态规划
小宋加油啊7 小时前
机械臂抓取物体 PVN3D算法调研学习
学习·算法·3d
lqqjuly7 小时前
前沿算法深度解析(一)
算法
小欣加油8 小时前
leetcode1926 迷宫中离入口最近的出口
数据结构·c++·算法·leetcode·职场和发展
happymaker062610 小时前
LeetCodeHot100——42.接雨水
算法
阿正的梦工坊11 小时前
【Rust】07-错误处理:Option、Result 与 ? 运算符
开发语言·算法·rust
八解毒剂12 小时前
数据结构-平衡二叉树——对二叉搜索树的优化
数据结构·c++·算法
运行时记录13 小时前
别再手动写提示词了 — SkillOpt 让技能文档自己进化
算法
啦啦啦啦啦zzzz13 小时前
算法总结(二分查找、双指针)
c++·算法