📜  门| GATE CS Mock 2018 |第 56 题(1)

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

GATE CS Mock 2018 | 第 56 题

这道题目是 GATE CS Mock 2018 中的第 56 题。该题目考察程序员对于数据结构和算法的理解。

题目描述

给定一个字符串 s,请你找到最长的不包含重复字符的子串的长度。

示例

输入: "abcabcbb"

输出: 3

解释: 最长的不含重复字符的子串是 "abc"。

解题思路

可以用一种滑动窗口的方法来解决这道问题。

具体做法是,维护两个指针 ij,表示子串的左边界和右边界,初始时都指向字符串的第一个字符。

然后,我们将右指针 j 向右移动,每当遇到一个新字符,就判断这个字符在之前是否出现过。

如果之前没有出现过,那么继续向右移动 j,并更新最长子串的长度。

如果之前出现过,那么左指针 i 就向右移动一位。

为了记录字符是否出现过,可以使用一个哈希表来保存每个字符最后一次出现的位置。

代码实现
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        i, ans = 0, 0
        dic = {}
        for j in range(len(s)):
            if s[j] in dic:
                i = max(i, dic[s[j]] + 1)
            dic[s[j]] = j
            ans = max(ans, j - i + 1)
        return ans
时间复杂度分析

该算法的时间复杂度为 $O(n)$。其中,$n$ 是字符串的长度。因为每个字符只会被访问一次,所以时间复杂度是线性的。同时,该算法的空间复杂度为 $O(min(n, m))$,其中,$n$ 是字符串的长度,$m$ 是字符集的大小。因为使用了一个哈希表来保存每个字符最后一次出现的位置,所以空间复杂度和字符集大小有关。