方法一:动态规划 + 哈希表

哈希表统计: 遍历字符串 s 时,使用哈希表(记为 dic )统计 各字符最后一次出现的索引位置 。
左边界 i获取方式: 遍历到 s[j]时,可通过访问哈希表 dic[s[j]]获取最近的相同字符的索引 i。
复杂度分析:
时间复杂度 O(N) : 其中 N 为字符串长度,动态规划需遍历计算 dp 列表。
空间复杂度 O(1) : 字符的 ASCII 码范围为 0 ~ 127 ,哈希表 dic 最多使用 O(128) = O(1) 大小的额外空间。
代码:
class Solution:
    def lengthOfLongestSubstring(self , s ):
        # write code here
        dic  = {}
        res = tmp = 0
        for j in range(len(s)):
            i  = dic.get(s[j],-1)
            dic[s[j]] =j
            tmp = tmp +1 if tmp< j-i else j-i
            res = max(res, tmp)
        return res

参考资料: