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

题目

给定一个字符串 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
};
相关推荐
Yuzhiyuxia1 小时前
【AI Agent面试系列】AI Agent记忆机制知识点1
人工智能·面试·职场和发展
UIU1142 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场2 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi2 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David3 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院4 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng4 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
j7~7 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py8 小时前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
Shaoshing8 小时前
LeetCode100 42.接雨水
java·算法·leetcode