Skip to content

3. 无重复字符的最长子串

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

示例:

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

解题思路

使用滑动窗口,每次循环移动右指针,左指针只在窗口内出现重复字符时移动,并记下窗口长度。

  • 定义一个滑动窗口,用两个指针表示窗口的左右边界,即左指针和右指针
  • 每次循环开始时,检查新字符(即右指针所在位置字符)在窗口中是否重复
  • 如重复,移动左指针到该字符串重复位置的下一位
  • 然后,记录新字符最后出现位置
  • 记录下窗口的最大长度
  • 每次循环结束时,向右移动右指针

动画演示

字符串: abcabcbb
最长子串的长度: 0
左指针: 0
右指针: 0
哈希表: []
a b c a b c b b
参考答案
ts
function lengthOfLongestSubstring(s: string): number {
  // 无重复字符的最长子串长度
  let max = 0;
  // 定义双指针
  let left = 0;
  let right = 0;
  // 定义哈希表
  const hash = new Map();
  // 滑动窗口
  while (left < s.length && right < s.length) {
    if (left !== right && hash.has(s[right])) {
      // 重复字符,移动左指针到重复字符的下一个字符
      // 使用 Math.max 防止回退
      left = Math.max(left, hash.get(s[right]) + 1);
    }
    // 记录字符最后出现的位置
    hash.set(s[right], right);
    // 记录最大长度
    max = Math.max(max, right - left + 1);
    // 移动右指针
    right++;
  }
  // 返回结果
  return max;
};