给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
分析
- 题目不长,有很多细节
- 遍历字符串,当遇到和之前窗口内相同的字母时,要进行处理,计算窗口的长度和最大长度进行比较,并且要对开始位置进行更新
- 计算窗口内的字母,可以用hash,这样比较快,但是怎么移除不在窗口内的呢,其实可以通过开始位置的索引是否小于重复字母的索引,字母的索引不断更新,可以通过字典记忆,只需要看最新的字母的索引和开始未知的索引的位置比较即可,而其中hash也可以通过字典的key集合替代
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# 边走边滑动,用字典记住初始位置
alpha_to_index = {}
# 记录窗口开始位置
start_index = 0
max_len = 0
for i, alpha in enumerate(s):
if alpha in alpha_to_index and alpha_to_index[alpha] >= start_index:
max_len = max(max_len, i - start_index)
# 要从之前的相同的字母位置+1开始算起
start_index = alpha_to_index[alpha] + 1
alpha_to_index[alpha] = i
n = len(s)
max_len = max(max_len, n - start_index)
return max_len








网友评论