1. 滑动窗口算法基础解析
滑动窗口算法是处理字符串和数组问题的经典技巧,特别适合解决子串、子数组相关的查找问题。它的核心思想是通过维护一个动态变化的窗口,在遍历过程中高效地更新和检查窗口内的数据。
1.1 算法原理与适用场景
滑动窗口算法通过两个指针(通常称为左指针和右指针)来定义窗口的边界。右指针负责扩展窗口,左指针负责收缩窗口,通过这种动态调整来寻找满足特定条件的子区间。
这种算法特别适合以下场景:
- 需要查找满足某种条件的连续子区间
- 暴力解法时间复杂度在O(n²)以上的问题
- 可以通过局部更新而非全局重新计算来维护窗口状态的问题
滑动窗口算法通常能将时间复杂度从暴力解法的O(n²)优化到O(n),因为它避免了不必要的重复计算。在字符串处理中,这种优势尤为明显。
1.2 两种基本模式
滑动窗口算法有两种基本实现模式:
-
可变长度窗口:窗口大小在运行过程中会发生变化,如"无重复字符的最长子串"问题。这种模式下:
- 右指针每次迭代都向右移动
- 左指针根据特定条件(如出现重复字符)向右移动
- 需要实时记录窗口的最大/最小值
-
固定长度窗口:窗口大小保持不变,如"找到字符串中所有字母异位词"问题。这种模式下:
- 左右指针同步移动
- 窗口大小等于目标子串长度
- 每次移动只需处理进出的元素,无需重新计算整个窗口
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 无重复字符的最长子串实现详解
2.1 问题分析与解法选择
题目要求找出字符串中不包含重复字符的最长子串的长度。暴力解法是检查所有可能的子串,时间复杂度为O(n²),显然不够高效。
滑动窗口是更优的选择,因为:
- 子串必须是连续的(符合窗口特性)
- 可以通过哈希集合快速判断重复
- 窗口调整时只需处理边界变化,无需重新检查整个子串
2.2 核心实现步骤
实现这个算法需要以下几个关键步骤:
- 初始化:创建哈希集合存储窗口字符,初始化左右指针和结果变量
- 右指针扩展:每次迭代将右指针字符加入集合
- 重复检测与处理:如果发现重复字符,移动左指针直到消除重复
- 更新结果:每次调整窗口后记录最大长度
关键点:哈希集合的contains()和add()操作
