返回

刷题精粹:在字符串中寻找最长无重复子串

前端

引言

在前端开发中,字符串操作是不可或缺的一部分。掌握在字符串中查找最长无重复子串的技术对于高效地处理文本数据至关重要。本文将深入剖析 LeetCode 上的经典问题“3. 无重复字符的最长子串”,并提供一份分步指南,帮助你解决这个问题。

问题陈述

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

举例

输入:s = "abcabcbb"
输出:3
解释:最长无重复子串为 "abc",长度为 3。

方法

这个问题可以采用滑动窗口的方法来解决,这种方法使用两个指针来维护一个窗口,在窗口内查找最长无重复子串。

步骤:

  1. 初始化两个指针:start 和 end,它们都指向字符串 s 的开头。
  2. 使用一个集合或对象来存储窗口中出现的字符。
  3. 循环执行以下步骤,直到 end 超过字符串的末尾:
    • 如果窗口中不包含字符 s[end],则将 s[end] 添加到窗口中,并向右移动 end 指针。
    • 如果窗口中包含字符 s[end],则从窗口中移除 start 指针指向的字符,并向右移动 start 指针。
    • 在每次迭代中,记录窗口的长度。
  4. 返回记录的最大窗口长度。

JavaScript 代码实现

const lengthOfLongestSubstring = (s) => {
  if (s.length === 0) {
    return 0;
  }

  let start = 0;
  let end = 0;
  let maxLength = 0;
  const charSet = new Set();

  while (end < s.length) {
    if (!charSet.has(s[end])) {
      charSet.add(s[end]);
      maxLength = Math.max(maxLength, end - start + 1);
      end++;
    } else {
      charSet.delete(s[start]);
      start++;
    }
  }

  return maxLength;
};

实例

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

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

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

结论

解决 LeetCode 问题“3. 无重复字符的最长子串”是掌握字符串操作技巧的一个重要步骤。通过使用滑动窗口方法,我们可以有效地找到字符串中不含重复字符的最长子串。本文提供了清晰的分步指南和 JavaScript 代码示例,帮助你理解并实现这种方法。