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

题目

给定一个字符串 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
};
相关推荐
吃好睡好便好3 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
仰泳之鹅4 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
x_yeyue6 小时前
三角形数
笔记·算法·数论·组合数学
念何架构之路7 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星7 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
失去的青春---夕阳下的奔跑7 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
黎阳之光8 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生
丷丩8 小时前
三级缓存下MVT地图瓦片服务性能优化策略
算法·缓存·性能优化·gis·geoai-up
m0_629494738 小时前
LeetCode 热题 100-----25.回文链表
数据结构·算法·leetcode·链表
ʚ希希ɞ ྀ9 小时前
单词拆分----dp
算法