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

📅  最后修改于: 2023-12-03 15:28:48.127000             🧑  作者: Mango

门|门 IT 2005 |问题 15

简介

这是门|门 IT 2005 的第 15 个问题,主要涉及计算机科学中的算法问题,需要使用程序来解决。

题目描述

给定一个字符串,找出其中最长的不重复子串的长度。

例如,对于字符串 "abcabcbb",最长的不重复子串是 "abc",长度为 3。

解题思路

一种常见的解法是使用双指针和哈希表。

设 left 和 right 为指向子串开头和结尾的指针,初始时二者都指向字符串开头。

使用哈希表记录每个字符最近出现的位置,设为 pos。

遍历字符串,每次将 right 向右移动一位,并更新哈希表中对应字符的 pos。

如果发现当前字符已经在哈希表中出现过,说明当前子串中出现了重复字符,需要将 left 向右移动,直到重复字符不再出现为止,并更新哈希表。

每移动一次 left 或 right,都需要更新一次最长子串的长度。最终得到的长度即为所求。

实现过程见以下代码片段:

def lengthOfLongestSubstring(s: str) -> int:
    n = len(s)
    if n == 0:
        return 0

    char_map = {}
    max_len = 1
    left = 0
    for right in range(n):
        c = s[right]
        if c in char_map and left <= char_map[c] <= right:
            left = char_map[c] + 1
        else:
            max_len = max(max_len, right - left + 1)
        char_map[c] = right

    return max_len
参考资料