返回

「双指针」轻松解题 LeetCode 3:寻找字符串最长不重复子串长度

前端

在本文中,我们将共同探索「双指针」算法的奇妙世界,用它来解决 LeetCode 上一道经典题目——3. 无重复字符的最长子串(中等)。准备好踏上这段编码之旅了吗?

1. 认识「双指针」算法

「双指针」算法是一种遍历技巧,使用两个指针同时扫描数组或字符串。这两个指针可以向一个方向移动,也可以向相反的方向移动,具体取决于算法的具体需求。

2. 了解题目要求

题目要求我们找到给定字符串中不含有重复字符的最长子串的长度。为了便于理解,我们举一个例子:

输入:s = "abcabcbb"
输出:3
解释:最长无重复子串为 "abc",其长度为 3

3. 运用「双指针」算法

为了解决这个问题,我们可以使用「双指针」算法。我们使用两个指针 leftright 来遍历字符串。left 指针指向子串的开头,而 right 指针指向子串的结尾。我们从字符串的开头开始,leftright 指针都指向第一个字符。然后,我们开始向右移动 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. 无重复字符的最长子串(中等)」这道题目。继续努力,你会发现编码之旅的乐趣无穷!