滑动窗口算法是一种常用的技巧,适用于解决一类字串或子数组问题,如最小覆盖子串、最长无重复字符串子串等。滑动窗口解题思路:
1. 初始化窗口和计数器;使用两个指针left和right表示窗口的左右边界,初始化一个计数器或者哈希表来记录窗口内的元素情况。
2.移动右指针扩大窗口:不断移动右指针right,直到窗口覆盖了需要的元素或满足条件。
3.移动左指针缩小窗口:一旦找到满足条件的窗口,尝试移动左指针left缩小窗口,同时仍保持满足条件;
4.更新结果:在移动左指针的过程中,不断更新结果,如记录最小覆盖子串的长度、最长无重复字符子串的长度等;
5.重复步骤2至4:不断重复步骤2至4,直达遍历完整个字符串或数组;
通过不断调整窗口的左右边界,滑动窗口算法可以在线性时间复杂度内解决一些子串或子数组的问题。
int left = 0, right = 0;
int windowSize = 0;
// 初始化计数器或哈希表
while (right < s.length()) {
// 扩大窗口
// 更新计数器或哈希表
while (窗口符合条件) {
// 缩小窗口
// 更新计数器或哈希表
// 更新结果
// 移动左指针
left++;
}
// 移动右指针
right++;
}
return 结果;