返回

HOT100——无重复字符的最长子串(JS实现)

前端

无重复字符的最长子串

问题

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

解题思路

本题采用双指针 + 哈希表的方式解决问题。

首先定义两个指针 leftright,分别指向子串的左右端点。然后初始化一个哈希表 map,用于存储每个字符最后一次出现的位置。

从左到右遍历字符串,每一步执行以下操作:

  1. 检查当前字符 s[right] 是否在哈希表 map 中。
  2. 如果存在,更新 left 指针为 map[s[right]] + 1,排除重复字符。
  3. 更新哈希表 map[s[right]]right
  4. 计算子串长度 right - left + 1 并更新最大长度 maxLen
  5. right 指针右移一位。

right 指针移动到字符串的最后一个元素时,循环结束。

代码实现(JS)

/**
 * 找出不包含重复字符的最长子串的长度
 *
 * @param {string} s 输入字符串
 * @return {number} 最长子串长度
 */
const lengthOfLongestSubstring = (s) => {
  // 初始化双指针和哈希表
  let left = 0, right = 0;
  const map = {};

  // 最大长度
  let maxLen = 0;

  // 从左到右遍历字符串
  while (right < s.length) {
    // 检查当前字符是否在哈希表中
    if (map[s[right]] !== undefined) {
      // 如果存在,更新left指针
      left = Math.max(left, map[s[right]] + 1);
    }

    // 更新哈希表
    map[s[right]] = right;

    // 计算子串长度并更新最大长度
    maxLen = Math.max(maxLen, right - left + 1);

    // 右指针右移一位
    right++;
  }

  return maxLen;
};

示例

const s = "abcabcbb";
const result = lengthOfLongestSubstring(s); // 3

const s2 = "bbbbb";
const result2 = lengthOfLongestSubstring(s2); // 1

const s3 = "pwwkew";
const result3 = lengthOfLongestSubstring(s3); // 3

复杂度分析

  • 时间复杂度:O(n),其中 n 为字符串的长度。
  • 空间复杂度:O(min(n, m)),其中 m 为哈希表中元素的个数,最多为 n。