解题思路:滑动窗口
有一个很关键的点是,需要使用一个数组去存储每一个位置出现的次数
代码如下
package com.codeking.lc;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @author xiongjl
* @since 2023/8/3 18:31 53
*/
public class lc438 {
public static void main(String[] args) {
List<Integer> anagrams = new lc438().findAnagrams("cbaebabacd", "abc");
System.out.println(anagrams);
}
public List<Integer> findAnagrams(String s, String p) {
// 这个题目使用滑动窗口去解答,关键是这种题目,需要找到一个去比较的标准
// 解法一,数组+滑动窗口
// 处理p直接用数组存储
int[] pArr = new int[26];
for (int i = 0; i < p.length(); i++) {
pArr[p.charAt(i) - 'a']++;
}
List<Integer> res = new ArrayList<>();
int l = 0, r = 0;
int[] window = new int[26];
char[] charArray = s.toCharArray();
while (r < s.length()) {
window[charArray[r] - 'a']++;
if (r - l + 1 == p.length()) {
// 滑动窗口比较,需要使用Arrays
if (Arrays.equals(window, pArr)) {
res.add(l);
}
window[charArray[l] - 'a']--;
l++;
}
r++;
}
return res;
}
}