滑动窗口(Sliding Window)是一种用于解决字符串或数组相关问题的算法技巧。它通过维护一个窗口,该窗口在数据结构上可以是一个固定大小的窗口或可变大小的窗口,然后在数据结构中滑动窗口的起始位置或结束位置来解决问题。
滑动窗口算法通常适用于以下类型的问题:
- 子串或子数组问题:找到最长的连续子串或子数组,使其满足某种条件。
- 字符或数字的频率问题:统计在给定窗口范围内字符或数字的出现频率或数量。
滑动窗口算法的核心思想是通过调整窗口的起始位置和结束位置,来有效地缩小问题的搜索空间。它通过移动窗口的方式,每次处理一个新的元素或字符,以获得所需的结果。
具体步骤如下:
- 初始化窗口的起始位置和结束位置。
- 开始遍历字符串或数组,并根据问题要求进行相应的操作。
- 当满足窗口的某种条件时,更新结果或记录信息。
- 移动窗口的起始位置或结束位置,以调整窗口大小。
- 重复步骤2到4,直到遍历完整个字符串或数组。
滑动窗口算法常常可以在O(n)的时间复杂度内解决问题,因为每个元素或字符至多被处理两次(进入窗口和离开窗口),而不需要对每个元素进行全局搜索。
滑动窗口是一种高效且常用的算法技巧,可以应用于多种问题中,特别适用于子串或子数组问题以及频率统计问题。
例如:较为经典的一道算法题目:
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
JAVA代码实现:
import java.util.HashMap;
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();
int maxLen = 0;
int start = 0;
HashMap<Character, Integer> map = new HashMap<>();
for (int end = 0; end < n; end++) {
char c = s.charAt(end);
if (map.containsKey(c) && map.get(c) >= start) {
start = map.get(c) + 1;
}
map.put(c, end);
maxLen = Math.max(maxLen, end - start + 1);
}
return maxLen;
}
}