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

题目

给定一个字符串 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
};
相关推荐
徐小夕11 小时前
表格、文档、甘特、大屏、表单一站打通:pxcharts超级表格4.0正式上线!
前端·算法·github
Xin77011 小时前
LeetCode 23.合并 K 个升序链表(分治递归)
leetcode
TechLee12 小时前
跨语言加解密总对不上?这个纯 Go 神库让 AES/RSA 与 PHP、Java 100% 互通
java·后端·算法
月华路14 小时前
G1 新生代对象晋升老年代:实现机制与 GC 日志
java·jvm·算法
万法若空14 小时前
排列组合恒等式
c++·算法
Nil20814 小时前
leetcode 105从前序和中序遍历序列构造二叉树
算法·leetcode·职场和发展
一直C14 小时前
【数据结构】哈希表+算法复杂度与经典排序查找(C语言)
java·linux·开发语言·数据结构·算法·ubuntu·散列表
淡海水14 小时前
04-02-哈希-Dictionary-TKey-TValue-上-核心数据结构
数据结构·算法·c#·哈希算法·编译·字典·dictionary
戴西软件15 小时前
国内有哪些数据轻量化格式转换软件?
数据库·算法·安全·信息可视化·自动化·rpa
老洋葱Mr_Onion15 小时前
【C++】CSP-J初赛模拟卷七错题整理(作者自用)
c++·算法·深度优先