返回
「双指针」轻松解题 LeetCode 3:寻找字符串最长不重复子串长度
前端
2023-12-26 11:40:01
在本文中,我们将共同探索「双指针」算法的奇妙世界,用它来解决 LeetCode 上一道经典题目——3. 无重复字符的最长子串(中等)。准备好踏上这段编码之旅了吗?
1. 认识「双指针」算法
「双指针」算法是一种遍历技巧,使用两个指针同时扫描数组或字符串。这两个指针可以向一个方向移动,也可以向相反的方向移动,具体取决于算法的具体需求。
2. 了解题目要求
题目要求我们找到给定字符串中不含有重复字符的最长子串的长度。为了便于理解,我们举一个例子:
输入:s = "abcabcbb"
输出:3
解释:最长无重复子串为 "abc",其长度为 3。
3. 运用「双指针」算法
为了解决这个问题,我们可以使用「双指针」算法。我们使用两个指针 left
和 right
来遍历字符串。left
指针指向子串的开头,而 right
指针指向子串的结尾。我们从字符串的开头开始,left
和 right
指针都指向第一个字符。然后,我们开始向右移动 right
指针,直到遇到重复的字符。一旦我们遇到重复的字符,我们就会将 left
指针移到重复字符的下一个字符。我们继续这个过程,直到 right
指针到达字符串的末尾。
4. 实现细节
在实现中,我们需要维护一个哈希表来记录每个字符最后出现的位置。当我们遍历字符串时,我们可以检查哈希表中是否存在当前字符。如果存在,则表示该字符之前已经出现过,我们需要将 left
指针移到该字符的下一个字符。否则,我们将当前字符添加到哈希表中,并将 right
指针右移。
5. 代码示例
def length_of_longest_substring(s):
"""
:type s: str
:rtype: int
"""
char_index_map = {}
max_length = 0
left = 0
for right in range(len(s)):
if s[right] in char_index_map and char_index_map[s[right]] >= left:
left = char_index_map[s[right]] + 1
char_index_map[s[right]] = right
max_length = max(max_length, right - left + 1)
return max_length
if __name__ == "__main__":
s = "abcabcbb"
result = length_of_longest_substring(s)
print(result)
6. 结语
希望这篇指南能帮助你理解「双指针」算法,并解决 LeetCode 上的「3. 无重复字符的最长子串(中等)」这道题目。继续努力,你会发现编码之旅的乐趣无穷!