返回

LeetCode HOT100 003:无重复字符的最长子串,速来围观

IOS

在算法的世界里,字符串处理一直是一个重要的话题。LeetCode HOT100 系列题库中的第 003 题——无重复字符的最长子串,就是一道经典的字符串处理题目。本文将详细介绍如何高效地解决这个问题。

题目描述

给定一个字符串,找出其中无重复字符的最长子串的长度。例如,对于字符串 "abcabcbb",无重复字符的最长子串是 "abc",其长度为 3。

解题思路

解决这个问题的关键在于使用滑动窗口技术。滑动窗口是一种动态维护子串的方法,通过调整窗口的左右边界来找到满足条件的最长子串。

滑动窗口的基本概念

滑动窗口由两个指针组成:左指针(l)和右指针(r)。初始时,两个指针都指向字符串的起始位置。随着右指针的移动,窗口会不断扩展;当窗口内出现重复字符时,左指针会向右移动,以缩小窗口。

具体步骤

  1. 初始化左指针 l 和右指针 r 为 0。
  2. 使用一个哈希表来记录当前窗口内每个字符的最新位置。
  3. 移动右指针 r,逐个字符地扩展窗口。
  4. 如果当前字符已经在哈希表中存在,说明出现了重复字符,此时需要移动左指针 l 到重复字符的下一个位置。
  5. 更新无重复字符的最长子串的长度。
  6. 重复步骤 3-5,直到右指针 r 到达字符串的末尾。

实现方法

下面是使用 Python 实现上述思路的代码示例:

def lengthOfLongestSubstring(s):
    """
    :type s: str
    :rtype: int
    """
    l = 0
    r = 0
    hash_table = {}
    max_length = 0

    for i in range(len(s)):
        if s[i] not in hash_table:
            hash_table[s[i]] = i
            r += 1
            max_length = max(max_length, r - l)
        else:
            l = max(l, hash_table[s[i]] + 1)
            hash_table[s[i]] = i
            r += 1

    return max_length

代码解析

  • lr 分别表示滑动窗口的左右边界。
  • hash_table 用于记录当前窗口内每个字符的最新位置。
  • max_length 用于记录无重复字符的最长子串的长度。
  • 遍历字符串 s,如果当前字符不在 hash_table 中,则将其添加到 hash_table 中,并更新 max_length
  • 如果当前字符已经在 hash_table 中存在,则移动左指针 l 到重复字符的下一个位置,并更新 hash_table

时间复杂度与空间复杂度

  • 时间复杂度:O(n),其中 n 是字符串的长度。每个字符最多被访问两次(一次由右指针,一次由左指针)。
  • 空间复杂度:O(min(m, n)),其中 m 是字符集的大小,n 是字符串的长度。在最坏情况下,哈希表需要存储所有字符的位置。

相关资源

结语

LeetCode 003 无重复字符的最长子串是一道经典的字符串处理题目,通过使用滑动窗口技术,我们可以高效地解决这个问题。希望本文的介绍能帮助大家更好地理解和掌握这一技术。