题目描述
给定一个字符串 s,请你找出其中不含有重复字符的 最长子串 的长度。
示例
1 | 输入: s = "abcabcbb" |
滑动窗口解法
思路分析
使用滑动窗口,维护一个不含重复字符的窗口。窗口用两个指针 start 和 end 表示,使用 HashSet 来记录窗口中的字符。
- 初始化
start = 0,end = 0,max_length = 0 - 如果
s[end]不在集合中,将其加入集合,扩大窗口 - 如果
s[end]已经在集合中,移除s[start]并缩小窗口 - 重复步骤 2-3 直到
end到达字符串末尾
代码实现
1 | use std::collections::HashSet; |
复杂度分析
- 时间复杂度:O(n),其中 n 是字符串的长度。每个字符最多被访问两次(一次被
end指针,一次被start指针)。 - 空间复杂度:O(min(m, n)),其中 m 是字符集的大小。在题目中,m 通常是一个常数(ASCII 字符集为 128,Unicode 可能更大)。
算法演示
以字符串 "abcabcbb" 为例:
1 | 初始状态:start = 0, end = 0, max_length = 0, unique_chars = {} |