返回

剑指Offer专栏:与滑动窗口算法一起称霸字符串题目

前端

LeetCode是一个算法竞赛平台,它提供了许多有趣且具有挑战性的算法题目。其中,有一道题特别引人注目,那就是无重复字符的最长子串。这道题要求我们找到一个字符串中最长的子串,其中不包含任何重复字符。

滑动窗口算法是一种非常高效的算法,它适用于解决各种字符串问题。它的基本思想是将一个窗口在字符串中移动,每次移动一个字符。当窗口中的所有字符都不重复时,我们就找到了一个无重复字符的最长子串。

具体来说,我们可以按照以下步骤使用滑动窗口算法来解决无重复字符的最长子串问题:

  1. 初始化一个滑动窗口,窗口大小为1。
  2. 将窗口放在字符串的第一个字符上。
  3. 检查窗口中的所有字符是否都不重复。
  4. 如果窗口中的所有字符都不重复,则将窗口向右移动一个字符。
  5. 重复步骤3和步骤4,直到窗口到达字符串的末尾。
  6. 在整个过程中,记录窗口中字符数量最多的子串。

使用JavaScript代码实现上述算法,我们可以得到以下代码:

function findLongestSubstringWithoutRepeatingCharacters(str) {
  if (str === null || str.length === 0) {
    return 0;
  }

  let longestSubstring = "";
  let start = 0;
  let end = 0;
  let windowSize = 1;

  while (end < str.length) {
    const windowSubstring = str.substring(start, end + 1);
    if (windowSubstring.length === windowSize && isUnique(windowSubstring)) {
      if (windowSize > longestSubstring.length) {
        longestSubstring = windowSubstring;
      }
      windowSize++;
      end++;
    } else {
      start++;
    }
  }

  return longestSubstring;
}

function isUnique(str) {
  const charSet = new Set();
  for (let i = 0; i < str.length; i++) {
    const char = str[i];
    if (charSet.has(char)) {
      return false;
    }
    charSet.add(char);
  }
  return true;
}

使用上面的代码,我们可以轻松地解决LeetCode中无重复字符的最长子串问题。该代码的时间复杂度为O(n^2),其中n是字符串的长度。虽然时间复杂度较高,但对于大多数实际场景来说,它的性能已经足够好了。

滑动窗口算法是一个非常强大的算法,它可以用来解决各种字符串问题。掌握了这个算法,你就能轻松应对LeetCode中许多字符串题目。