返回

LeetCode 3. 无重复字符的最长子字符串 (Python实现)

后端

算法原理

滑动窗口算法是解决LeetCode 3. 无重复字符的最长子字符串 问题的一种常见算法。它的基本思想是在字符串中创建一个窗口,窗口的长度等于要查找的最长子字符串的长度。然后,该窗口在字符串中滑动,并检查窗口中的字符是否包含重复字符。如果窗口中的字符不包含重复字符,则窗口的大小增加一,并继续滑动。如果窗口中的字符包含重复字符,则窗口的大小保持不变,并继续滑动。这个过程一直持续到窗口到达字符串的末尾。最后,窗口的大小就是无重复字符的最长子字符串的长度。

具体实现步骤

  1. 初始化窗口大小为1,并将其放在字符串的开头。
  2. 检查窗口中的字符是否包含重复字符。
  3. 如果窗口中的字符不包含重复字符,则窗口的大小增加一,并继续滑动。
  4. 如果窗口中的字符包含重复字符,则窗口的大小保持不变,并继续滑动。
  5. 这个过程一直持续到窗口到达字符串的末尾。
  6. 最后,窗口的大小就是无重复字符的最长子字符串的长度。

代码注释

def length_of_longest_substring(s):
  """
  :type s: str
  :rtype: int
  """
  # 初始化窗口大小为1,并将其放在字符串的开头
  window_size = 1
  window_start = 0

  # 初始化无重复字符的最长子字符串的长度
  max_length = 0

  # 初始化窗口中的字符集合
  window_set = set()

  # 遍历字符串
  for i in range(len(s)):
    # 如果当前字符不在窗口中,则将其添加到窗口中,并增加窗口大小
    if s[i] not in window_set:
      window_set.add(s[i])
      window_size += 1

      # 更新无重复字符的最长子字符串的长度
      max_length = max(max_length, window_size)

    # 如果当前字符在窗口中,则从窗口中删除最早的字符,并移动窗口的起始位置
    else:
      window_set.remove(s[window_start])
      window_start += 1

  # 返回无重复字符的最长子字符串的长度
  return max_length

测试用例和运行结果

测试用例1:

s = "abcabcbb"

运行结果:

3

测试用例2:

s = "bbbbb"

运行结果:

1

测试用例3:

s = "pwwkew"

运行结果:

3

总结

LeetCode 3. 无重复字符的最长子字符串 问题是LeetCode上的一道经典算法题,也是面试中经常被问到的问题。通过使用滑动窗口算法,我们可以高效地找到给定字符串中不含有重复字符的最长子字符串的长度。本篇文章详细讲解了算法的原理、具体实现步骤以及代码注释,最后给出相应的测试用例和运行结果。希望这篇教程能够帮助读者更好地理解滑动窗口算法,并能够轻松解决LeetCode 3. 无重复字符的最长子字符串 问题。