解题思路
从左往右扫描字符串,当遇到重复字符时,以上一个重复字符的索引 + 1来作为新的搜索起始位置
直至扫描到最后一个字符。
算法过程
- 创建数组
dic
,用于存放每个字符当前被标记的索引。 - 创建变量
start
,当出现重复字符的时候用于保存搜索的起始位置。 - 更新
start
:根据上一轮start
与dic[s[i]]
中的最大值来更新start
,为了确保[start+1, i]之间无重复字符且不倒退。 - 更新结果
maxL
: 取上一轮的maxL
与本轮的区间宽度[i - start]的最大值
代码
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
start, maxL, dic = -1, 0, {}
for i in range(len(s)):
if s[i] in dic:
start = max(dic[s[i]], start)
dic[s[i]] = i
maxL = max(maxL, i - start)
return maxL