Leetcode 3. 无重复字符的最长子串

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

示例 1:

输入: "abcabcbb"

输出: 3 

解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"

输出: 1

解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"

输出: 3

解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。

     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

**难度**: Medium

**标签**: 哈希表、 双指针、 字符串、 None、


# -*- coding: utf-8 -*-
# @Author  : LG

"""
执行用时:72 ms, 在所有 Python3 提交中击败了82.59% 的用户
内存消耗:13.7 MB, 在所有 Python3 提交中击败了5.88%

解题思路:
    双指针,一个遍历字符串,一个记录当前子串起始点。
    使用字典存放字符串元素,
    若元素重复:
        更新子串起始点
        字典更新元素下标
        计算最大子串长度
    若不重复:
        字典登记元素,记录下标
        更新最大子串长度
"""

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        start_, max_ = -1, 0
        record = {}
        for i, v in enumerate(s):
            if v not in record:
                record[v] = i
                max_ = max(i - start_, max_)
            else:
                start_ = max(record[v], start_)
                record[v] = i
                max_ = max(i - start_, max_)
        return max_