一、题目
二、题解
- start【left】不动,end【i】向后移动
- 当end【i】遇到重复字符,start【left】应该放在上一个重复字符的位置的后一位,同时记录最长的长度
- 怎样判断是否遇到重复字符,且怎么知道上一个重复字符的位置?–用哈希字典的键来判断是否重复,用值来记录该字符的下一个不重复的位置。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
substrr = dict()
left = 0
maxlen = 0
for i, value in enumerate(s):
index = substrr.get(value,-1) # 看value在字典中吗?如果在,返回下标值;不在,返回-1【这样在下面if判断时候,就不需要重复检查在不在字典中了,因为不在字典中时,-1一定比left(>=0)小,不在的话就更加不用进if里去了】
if index >= left: # 如果 新加入的值value 在最长子串范围内 [left,i)
left = substrr.get(value) + 1 # 左边界右移
substrr[value] = i
maxlen = max(maxlen , i - left + 1) # i从0开始,计数补加1
return maxlen
dict.get()感觉有点像KMP中next记录回退的下标