返回
LeetCode HOT100 003:无重复字符的最长子串,速来围观
IOS
2024-02-04 00:14:56
在算法的世界里,字符串处理一直是一个重要的话题。LeetCode HOT100 系列题库中的第 003 题——无重复字符的最长子串,就是一道经典的字符串处理题目。本文将详细介绍如何高效地解决这个问题。
题目描述
给定一个字符串,找出其中无重复字符的最长子串的长度。例如,对于字符串 "abcabcbb",无重复字符的最长子串是 "abc",其长度为 3。
解题思路
解决这个问题的关键在于使用滑动窗口技术。滑动窗口是一种动态维护子串的方法,通过调整窗口的左右边界来找到满足条件的最长子串。
滑动窗口的基本概念
滑动窗口由两个指针组成:左指针(l)和右指针(r)。初始时,两个指针都指向字符串的起始位置。随着右指针的移动,窗口会不断扩展;当窗口内出现重复字符时,左指针会向右移动,以缩小窗口。
具体步骤
- 初始化左指针
l
和右指针r
为 0。 - 使用一个哈希表来记录当前窗口内每个字符的最新位置。
- 移动右指针
r
,逐个字符地扩展窗口。 - 如果当前字符已经在哈希表中存在,说明出现了重复字符,此时需要移动左指针
l
到重复字符的下一个位置。 - 更新无重复字符的最长子串的长度。
- 重复步骤 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
代码解析
l
和r
分别表示滑动窗口的左右边界。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 无重复字符的最长子串是一道经典的字符串处理题目,通过使用滑动窗口技术,我们可以高效地解决这个问题。希望本文的介绍能帮助大家更好地理解和掌握这一技术。