1. 滑动窗口算法概述
滑动窗口(Sliding Window)是解决字符串和数组子区间问题的经典算法范式。它通过维护一个动态变化的窗口区间,在遍历过程中高效地更新和计算窗口内的状态,避免了暴力解法中大量的重复计算。
我在处理字符串相关问题时,滑动窗口往往是我的首选武器。它的时间复杂度通常能优化到O(n),比暴力解法的O(n²)或O(n³)要高效得多。下面通过力扣hot100中的两道经典题目,带大家深入掌握这种算法的精髓。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 无重复字符的最长子串问题解析
2.1 问题描述与核心思路
题目要求找出给定字符串中不含有重复字符的最长子串的长度。例如:
- 输入:"abcabcbb" → 输出:3("abc")
- 输入:"bbbbb" → 输出:1("b")
我的解题思路是:
- 使用哈希集合(HashSet)记录当前窗口内的字符
- 维护左右指针表示窗口边界
- 右指针不断右移扩展窗口
- 当遇到重复字符时,左指针右移收缩窗口
2.2 详细实现步骤
python复制def lengthOfLongestSubstring(s: str) -> int:
char_set = set()
left = 0
max_len = 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_len = max(max_len, right - left + 1)
return max_len
关键点说明:
char_set存储当前窗口内的唯一字符- 当
s[right]已存在时,持续移动left直到移除重复字符 - 每次更新窗口后记录最大长度
2.3 复杂度分析与优化
时间复杂度:O(n) - 每个字符最多被访问两次(右指针和左指针各一次)
空间复杂度:O(min(m,n)) - 取决于字符集大小和字符串长度
实际编码时我发现,使用字典记录字
