Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

滑动窗口算法

今天刷力扣题目,刷到了一个滑动窗口算法问题,这类算法问题之前没有遇到过,特此记录下来

解题思路

1.首先确定窗口的定义(比如子串的每个字符存在个数/子数组的和)
2.开始创建变量
2.1.window(HashMap/int)用来定义窗口。
2.2.left right指针[left, right)区间就是我们的窗口。
2.3结果res,需根据题意
3.window更新窗口值后,right++。到达窗口收缩条件,更新结果(如果满足题),window更新窗口值,left–

例题

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

1
2
3
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
1
2
3
4
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

1
2
3
4
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

解题办法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//窗口状态:窗口内字符的数量
//收缩条件:窗口内有字符数量大于1
class Solution {
public int lengthOfLongestSubstring(String s) {
HashMap<Character, Integer> window = new HashMap<>();
int left = 0, right = 0;
int res = 0;
while(right < s.length()){
char c1 = s.charAt(right);
window.put(c1, window.getOrDefault(c1, 0) + 1);
right++;
//窗口收缩不满足题意时收缩,也就是含有重读字符时
while(window.get(c1) > 1){
char c2 = s.charAt(left);
window.put(c2, window.getOrDefault(c2, 0) - 1);
left++;
}
res = Math.max(res, right - left);
}
return res;
}
}

评论