给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
n = len(s)
max = 0
# 子串的起始位置
start = 0
# 字典 key是字符 value是该字符最大的索引
d = {}
# 遍历字符串 i表示当前子串的最后一个位置
for i in range(n):
# 若 当前遍历到的字符先前已经遇到 且 当前子串的起始位置 <= 先前该字符的索引(start不能往回走)
if s[i] in d and start <= d[s[i]]:
# 上述条件满足 更新当前子串的起始位置
start = d[s[i]] + 1
# length 是当前子串的长度
length = i - start + 1
if length > max:
max = length
# 存入新字符 value是索引 或 更新旧字符 value是新索引
d[s[i]] = i
return max