前往此题

解题思路

从左往右扫描字符串,当遇到重复字符时,以上一个重复字符的索引 + 1来作为新的搜索起始位置

直至扫描到最后一个字符。

算法过程

  • 创建数组dic,用于存放每个字符当前被标记的索引。
  • 创建变量start,当出现重复字符的时候用于保存搜索的起始位置。
  • 更新start:根据上一轮startdic[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