Evan Wang
Evan WangFrontEnd Developer
  • Evan Wang
    Evan WangFrontEnd Developer
  • 前端相关
  • 算法题
  • 日常笔记
  • Chat With AI

两数之和
两数相加
无重复字符的最长子串
最长回文子串
盛水最多的容器
三数之和
电话号码的字母组合
有效括号
合并两个有序链表
括号生成
下一个排列
搜索旋转排序数组
在排序数组中查找元素的第一个和最后一个位置
删除链表的倒数第n个节点
组合总和
全排列
旋转图像
字母异位词分组
最大子数组合
跳跃游戏
反转链表
反转链表2
合并区间
最小路径和
编辑距离
颜色分类
爬楼梯
组合
子集
不同的二叉搜索树
验证二叉搜索树
对称二叉树
二叉树的层序遍历
二叉树的最大深度
从前序与中序遍历序列构造二叉树
只出现一次的数字
二叉树展开为链表
最长连续序列
单词拆分
环形链表
环形链表2
排序链表
相交链表
乘积最大子数组
最小栈
多数元素
打家劫舍
数组中重复的数据
二叉树的中序遍历
卖股票的最佳时机
数组中的第K个最大元素

  1. Articles
  1. More
  2. 3-无重复字符的最长子串.mdx
目录
题目思路代码
967 字
约 3 分钟
更新于 2026/08/20

无重复字符的最长子串

题目:

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

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

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

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

思路:

滑动窗口:

子串,意思是字符串 s 中间的某一部分,所以可以想象有一个遮罩层,在整个 s 上从左向右滑动,中间经历过最长的一个不重复的子串,就是题目要求的。

代码

const lengthOfLongestSubstring = (s) => {
  if (s.length === 0) return 0; // 如果传入的字符串长度为0 ,直接返回 0 
  
  let maxLength = 0; // 存储最长的 子串长度
  let arr = []; // 存储当前的子串(不一定是最长的,可能有重复子串)
  for (let i = 0; i < s.length; i++) { // 循环 s 的每一个元素
   	if(arr.includes(s[i])) { // 如果 arr 里面有当前的字符,则说明当前子串中有重复字母(此时只可能是最后一个字母和前面的字母有重复)
      while(arr.includes(s[i])) { // 删除当前子串的第一个字母,如果还有重复,接着删除
        arr.shift();
      }
    }
    
    arr.push(s[i]); // 如果没有重复,则将当前字符存入 arr 数组中
    maxLength = Math.max(maxLength, arr.length) // 每次都保存一下最长子串的长度,供返回结果使用
  }
  return maxLength
}