滑动窗口例题:
一、3. 无重复字符的最长子串
题目要求:就是说找到包含不同字母最长的串。
思路:可以想到使用set去重,同时应用滑动窗口。本质上还是双指针法,l是窗口左边界
r是窗口右边界。 如果set包含了当前字母就直接删除左边界的值。
注意:一定是比较max_num与set大小
代码:
public class c无重复字符的最长子串 {
public int lengthOfLongestSubstring(String s) {
// 使用set去重
Set<Character> set = new HashSet<>();
int l = 0;
int r = 0;
// 返回值
int max_sum = 0;
//
while (r < s.length()){
// 当set不包含当前字母时就直接add 并窗口右移
if (!set.contains(s.charAt(r))){
set.add(s.charAt(r));
r++;
}else{
set.remove(s.charAt(l));
l++;
}
max_sum = Math.max(max_sum, set.size());
}
return max_sum;
}
}
二、438. 找到字符串中所有字母异位词
1.题目要求:
2.思路:仍然是滑动窗口; 不过特殊在需要对s中的前p长度的字符串进行单独处理。
3.代码:
public class c找到字符串中所有字母异位词 {
public List<Integer> findAnagrams(String s, String p) {
// 使用固定窗口
// len1指定为字符串s的长度
int len1 = s.length();
int len2 = p.length();
if (len2 > len1) return new ArrayList<>();
// 数组a保存字符串s即待匹配的字符串
// 数组b保存模板字符串
int[] a = new int[26];
int[] b = new int[26];
int l = 0, r = len2;
List<Integer> res = new ArrayList<>();
// 一方面保存好模式串的数组,一方面将p长度的字符串大小进行匹配
for (int i = 0; i < len2; i++) {
a[s.charAt(i) - 'a']++;
b[p.charAt(i) - 'a']++;
}
// 如果s中前len2长度的字符串能匹配就直接add 0
if (Arrays.equals(a, b))
res.add(0);
// 然后使用滑动窗口逐一匹配
while (r < len1){
// 数组更新
a[s.charAt(r) - 'a'] ++;
a[s.charAt(l) - 'a'] --;
// 字符串匹配
if (Arrays.equals(a, b))
res.add(l + 1);
// 窗口滑动
l++;
r++;
}
return res;
}
}