LeetCode 「中等」3.无重复字符的最长子串

sankigan2025-2-14算法LeetCode

无重复字符的最长子串open in new window

题目描述

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

示例

输入: s = "abcabcbb"
输出: 3

输入: s = "bbbbb"
输出: 1

输入: s = "pwwkew"
输出: 3

解答

滑动窗口

关键思路

  1. 滑动窗口
  • 使用滑动窗口来维护一个不含有重复字符的子串
  • 滑动窗口的左右边界分别用两个指针 leftright 表示
  1. 哈希表
  • 使用一个哈希表(Map 或对象)来记录每个字符最近一次出现的位置
  • 这样可以快速判断当前字符是否已经在窗口中出现过
  1. 移动窗口
  • 遍历字符串,每次将右边界 right 向右移动一位
  • 如果当前字符已经在窗口中出现过,将左边界 left 移动到该字符上次出现位置的右边
  • 更新当前字符的最新位置
  • 记录当前窗口的长度,更新最长子串的长度

具体步骤

  1. 初始化
  • 初始化左边界 left 为 0
  • 初始化一个哈希表 charIndex 用于记录字符的最新位置
  • 初始化最长子串长度 maxLength 为 0
  1. 遍历字符串
  • 遍历字符串,每次将右边界 right 向右移动一位
  • 检查当前字符是否已经在窗口中出现过,如果出现过,更新左边界 left
  • 更新当前字符的最新位置
  • 更新最长子串的长度
  1. 返回结果
Code
/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
  let left = 0; // 左边界
  let maxLength = 0; // 最长子串的长度
  const charIndex = new Map(); // 用于记录字符的最新位置

  for (let right = 0; right < s.length; ++right) {
    const char = s[right]; // 当前字符

    // 如果字符已经在窗口中出现过,更新左边界
    if (charIndex.has(char)) {
      left = Math.max(left, charIndex.get(char) + 1);
    }

    // 更新当前字符的最新位置
    charIndex.set(char, right);

    // 更新最长子串的长度
    maxLength = Math.max(maxLength, right - left + 1);
  }

  return maxLength;
}
更新于 2025/3/27 16:25:36