📜  门|门 IT 2005 |问题 7(1)

📅  最后修改于: 2023-12-03 14:58:35.881000             🧑  作者: Mango

门|门 IT 2005 |问题 7

问题描述

在一个字符串中找到最长无重复字符子串的长度。

例如,在字符串“abcabcbb”中,最长无重复字符子串是“abc”,其长度为3。

思路分析

可以用哈希表记录字符在字符串中最后一次出现的位置,然后维护一个左右指针,如果右指针遇到重复的字符,则将左指针移动到右指针指向的字符上一次出现的位置的下一个位置。

代码实现
def longest_substring_without_repeating_characters(s: str) -> int:
    max_len = 0
    sub_start = 0
    char_dict = {}

    for i, c in enumerate(s):
        if c in char_dict and char_dict[c] >= sub_start:
            sub_start = char_dict[c] + 1
        char_dict[c] = i
        max_len = max(max_len, i - sub_start + 1)

    return max_len
测试样例
assert longest_substring_without_repeating_characters("abcabcbb") == 3
assert longest_substring_without_repeating_characters("bbbbb") == 1
assert longest_substring_without_repeating_characters("pwwkew") == 3
总结

本题常见解法是哈希表+滑动窗口,时间复杂度为$O(n)$,空间复杂度为$O(n)$。细节较多,需要注意左指针移动的条件,即只有当前字符在子串中出现过才需要移动。