滑动窗口-无重复字符的最长字串
max_length 更新保存的结果
 start 更新最长字串的起始位置
 char_index_map[char] + 1 重复位置+1作为新的起始位置
 i - start + 1 最长字串的末尾位置为i
 char_index_map[char] >= start
 (1) = : 新的重复位置在最开始start
 (2) > : 新的重复位置在max_length中间
以s只有一个元素为例子:
 i = 0
 i - start + 1 = 1
# 3. 无重复字符的最长子串
代码:
class Solution:def lengthOfLongestSubstring(self, s: str) -> int:char_index_map = {}max_length = 0start = 0for i, char in enumerate(s):if char in char_index_map and char_index_map[char] >= start:start = char_index_map[char] + 1char_index_map[char] = imax_length = max(max_length, i - start + 1)return max_length
输入:
s = "abcabcbb"
详细执行过程:
初始化:
- char_index_map = {}:用于记录每个字符及其对应的最新索引。
- max_length = 0:用于记录最长不重复子串的长度。
- start = 0:用于记录当前不重复子串的起始位置。
遍历字符串:
-  i=0, char='a':- char_index_map不包含- 'a',即- 'a'还没有出现过。
- 将 'a'存入char_index_map,即char_index_map = {'a': 0}。
- 计算当前不重复子串的长度:i - start + 1 = 0 - 0 + 1 = 1。
- 更新 max_length = max(0, 1) = 1。
 
-  i=1, char='b':- char_index_map不包含- 'b'。
- 将 'b'存入char_index_map,即char_index_map = {'a': 0, 'b': 1}。
- 计算当前不重复子串的长度:i - start + 1 = 1 - 0 + 1 = 2。
- 更新 max_length = max(1, 2) = 2。
 
-  i=2, char='c':- char_index_map不包含- 'c'。
- 将 'c'存入char_index_map,即char_index_map = {'a': 0, 'b': 1, 'c': 2}。
- 计算当前不重复子串的长度:i - start + 1 = 2 - 0 + 1 = 3。
- 更新 max_length = max(2, 3) = 3。
 
-  i=3, char='a':- char_index_map包含- 'a'且其索引(- 0)大于等于- start(- 0)。
- 说明 'a'在当前窗口中出现过重复,因此需要调整start的位置到'a'的下一个位置,即start = 0 + 1 = 1。
- 更新 char_index_map['a'] = 3(记录'a'的最新索引)。
- 计算当前不重复子串的长度:i - start + 1 = 3 - 1 + 1 = 3(长度保持不变)。
- max_length = max(3, 3) = 3(长度不变)。
 
-  i=4, char='b':- char_index_map包含- 'b'且其索引(- 1)大于等于- start(- 1)。
- 'b'在当前窗口中重复出现,因此将- start移动到- b的下一个位置:- start = 1 + 1 = 2。
- 更新 char_index_map['b'] = 4(记录'b'的最新索引)。
- 计算当前不重复子串的长度:i - start + 1 = 4 - 2 + 1 = 3。
- max_length = max(3, 3) = 3。
 
-  i=5, char='c':- char_index_map包含- 'c'且其索引(- 2)大于等于- start(- 2)。
- 'c'在当前窗口中重复出现,将- start移动到- c的下一个位置:- start = 2 + 1 = 3。
- 更新 char_index_map['c'] = 5。
- 计算当前不重复子串的长度:i - start + 1 = 5 - 3 + 1 = 3。
- max_length = max(3, 3) = 3。
 
-  i=6, char='b':- char_index_map包含- 'b'且其索引(- 4)大于等于- start(- 3)。
- 'b'在当前窗口中重复出现,将- start移动到- b的下一个位置:- start = 4 + 1 = 5。
- 更新 char_index_map['b'] = 6。
- 计算当前不重复子串的长度:i - start + 1 = 6 - 5 + 1 = 2(当前子串较短)。
- max_length = max(3, 2) = 3。
 
-  i=7, char='b':- char_index_map包含- 'b'且其索引(- 6)大于等于- start(- 5)。
- 'b'在当前窗口中重复出现,将- start移动到- b的下一个位置:- start = 6 + 1 = 7。
- 更新 char_index_map['b'] = 7。
- 计算当前不重复子串的长度:i - start + 1 = 7 - 7 + 1 = 1。
- max_length = max(3, 1) = 3(没有变化)。
 
最终结果:
- 遍历结束后,max_length是 3,表示最长不含重复字符的子串长度为 3。
