滑动窗口
伪代码框架
// 滑动窗口算法伪码框架
void slidingWindow(String s) {
// 用合适的数据结构记录窗口中的数据,根据具体场景变通
// 比如说,我想记录窗口中元素出现的次数,就用 map
// 如果我想记录窗口中的元素和,就可以只用一个 int
Object window = ...
int left = 0, right = 0;
while (right < s.length()) {
// c 是将移入窗口的字符
char c = s[right];
window.add(c)
// 增大窗口
right++;
1
...
// 判断左侧窗口是否要收缩
while (left < right && window needs shrink) {
// d 是将移出窗口的字符
char d = s[left];
window.remove(d)
// 缩小窗口
left++;
// 进行窗口内数据的一系列更新
...
}
}
}
使用案例
private static int getLongestFlawedVowelSubstrLen1(int flaw, String input) {
int left = 0;
int right = 0;
int nums = 0;
int result = 0;
while (right < input.length()) {
// c 是将移入窗口的字符
char add = input.charAt(right);
// 增大窗口
right++;
// 进行窗口内数据的一系列更新
if (!isYuanYin(add)) {
nums++;
}
if (nums == flaw && isYuanYin(input.charAt(left)) && isYuanYin(input.charAt(right - 1))){
result = Math.max(result, right - left);
}
// 判断左侧窗口是否要收缩
while (nums > flaw && left < right ) {
char delete = input.charAt(left);
// 缩小窗口
left++;
// 进行窗口内数据的一系列更新
if (!isYuanYin(delete) && nums != 0) {
nums--;
}
}
}
return result;
}