剑指 Offer 48. 最长不含重复字符的子字符串

一、题目

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

二、思路

三、代码

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        dic = {}
        res = tmp = 0
        for j in range(len(s)):
            i = dic.get(s[j], -1) # 获取索引 i
            dic[s[j]] = j # 更新哈希表
            tmp = tmp + 1 if tmp < j - i else j - i # dp[j - 1] -> dp[j]
            res = max(res, tmp) # max(dp[j - 1], dp[j])
        return res

Python 的 get(key,default)方法和 Java 的 getOrDefault(key,default), 代表当哈希表包含键 key 时返回对应 value,不包含时返回默认值 default。

四、分析

复杂度分析:
时间复杂度 O(N) : 其中 N为字符串长度,动态规划需遍历计算 dp 列表。
空间复杂度 O(1): 字符的 ASCII 码范围为 0 ~ 127 ,哈希表 dic 最多使用 O(128)=O(1)大小的额外空间。

posted @ 2022-12-17 10:17  ImreW  阅读(11)  评论(0编辑  收藏  举报