本题的考点是滑动链表(类似双指针的使用)
这是常规的滑动窗口
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
char_set = set()
left = 0
max_length = 0
for right in range(len(s)):
while s[right] in char_set:
char_set.remove(s[left])
left += 1
char_set.add(s[right])
max_length = max(max_length, right - left + 1)
return max_length
但是看过代码后发现一个问题,该代码对于出现重复字符后,左指针会不断向前移动直到窗口内不存在重复字符。
显然没必要这么移动,因为我要的是最大的,窗口只需要变大不需要变小。
故我修改了代码
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
char_index_map = {}
left = 0
max_length = 0
for right, char in enumerate(s):
if char in char_index_map and char_index_map[char] >= left:
left = char_index_map[char] + 1
char_index_map[char] = right
max_length = max(max_length, right - left + 1)
return max_length
用字典代替集合,实现当窗口不充盈时左指针跟随右指针一起移动,直到窗口充盈