通过一次遍历完成任务,避免了复杂的指针操作和集合管理,使得算法更易于理解和实现。
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
n = len(s)
if n == 0:
return 0
char_index = {} # 字符最后出现的位置
max_len = 0
start = 0
for end in range(n):
if s[end] in char_index and char_index[s[end]] >= start:
start = char_index[s[end]] + 1
char_index[s[end]] = end
max_len = max(max_len, end - start + 1)
return max_len
-
初始化:
n
是字符串s
的长度。- 如果
n
为0
,直接返回0
,因为空字符串没有无重复字符的子串。
-
变量定义:
char_index
是一个字典,用于记录每个字符最后出现的位置。max_len
用于记录最长的无重复字符子串的长度。start
是起始指针,表示当前无重复字符子串的起始位置。
-
主循环:
- 使用
end
来遍历字符串s
中的每个字符。 - 如果
s[end]
在char_index
中,并且其最后出现的位置大于等于start
,说明s[end]
在当前的无重复字符子串中出现过,需要更新start
到char_index[s[end]] + 1
,即从上一次出现位置的下一个位置开始新的子串。
- 使用
-
更新字典和最大长度:
- 每次更新
char_index[s[end]] = end
,表示更新s[end]
的最后出现位置为当前end
的位置。 - 计算当前子串长度
end - start + 1
,并更新max_len
。
- 每次更新
-
返回结果:
- 循环结束后,返回
max_len
,即最长的无重复字符子串的长度。
- 循环结束后,返回