📅  最后修改于: 2023-12-03 14:58:22.337000             🧑  作者: Mango
这道题目是 GATE CS Mock 2018 中的第 56 题。该题目考察程序员对于数据结构和算法的理解。
给定一个字符串 s
,请你找到最长的不包含重复字符的子串的长度。
输入: "abcabcbb"
输出: 3
解释: 最长的不含重复字符的子串是 "abc"。
可以用一种滑动窗口的方法来解决这道问题。
具体做法是,维护两个指针 i
和 j
,表示子串的左边界和右边界,初始时都指向字符串的第一个字符。
然后,我们将右指针 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$ 是字符集的大小。因为使用了一个哈希表来保存每个字符最后一次出现的位置,所以空间复杂度和字符集大小有关。