返回

突破编程瓶颈,巧解 LeetCode 无重复字符最长子串

后端

引言

算法问题是程序员进阶的必经之路,而 LeetCode 是磨练算法技能的绝佳平台。今天,我们聚焦于 LeetCode 第 3 题:无重复字符的最长子串。这道中等难度题目考验着你的字符串处理能力和算法思维。通过剖析巧妙的解题思路,我们将带你领略算法的魅力,提升你的编程水平。

题目

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

解题思路

这道题的本质是寻找字符串中连续且不包含重复字符的最长片段。我们可以使用滑动窗口算法来解决这个问题:

  1. 初始化滑动窗口: 使用两个指针,leftright,定义一个滑动窗口。一开始,将这两个指针都指向字符串的开头。
  2. 滑动窗口: 循环滑动窗口,将 right 指针向右移动,直到遇到重复字符。当遇到重复字符时,将 left 指针移动到重复字符的下一个位置。
  3. 记录最长子串: 在每次滑动窗口的过程中,记录当前窗口的长度,并更新最长子串的长度。

代码示例

def length_of_longest_substring(s):
  """
  返回字符串 s 中无重复字符的最长子串的长度。

  :param s: 给定的字符串
  :return: 最长子串的长度
  """

  left, right, max_length = 0, 0, 0
  char_index = {}  # 存储字符上次出现的位置

  while right < len(s):
    if s[right] in char_index and char_index[s[right]] >= left:
      # 如果当前字符在滑动窗口内出现过,更新 left 指针
      left = char_index[s[right]] + 1

    char_index[s[right]] = right  # 更新字符的最新出现位置
    max_length = max(max_length, right - left + 1)  # 更新最长子串长度
    right += 1  # 右指针右移

  return max_length

示例

输入:s = "abcabcbb"
输出:3  # 最长子串为 "abc"

输入:s = "bbbbb"
输出:1  # 最长子串为 "b"

输入:s = "pwwkew"
输出:3  # 最长子串为 "wke"

拓展

除了滑动窗口算法,还有其他解决方法,如哈希表法和 Manacher 算法。你可以探索不同的解法,加深对算法的理解。此外,尝试将这个算法应用于实际场景中,例如文本压缩或模式匹配。

总结

通过学习 LeetCode 第 3 题:无重复字符的最长子串,我们掌握了一种巧妙的算法技巧——滑动窗口算法。算法题的解决不仅仅在于代码实现,更在于思维训练和逻辑推理。通过不断练习,相信你的算法能力和编程水平将得到显著提升。