本题目主要是维护一个固定长度滑动窗口,进行异位判断,这里进行字符统计的时候很巧妙,是一个好思路。
class Solution {
public List<Integer> findAnagrams(String s, String p) {
List<Integer> ans = new ArrayList<>();
int[] cnS = new int[26];
int[] cnP = new int[26];
int n = s.length();
int len = p.length();
//统计p中个字符数量
for (int i = 0; i < p.length(); i++) {
cnP[p.charAt(i) - 'a']++;
}
for (int i = 0; i < n; i++) {
//遍历的时候同步统计,很精妙
cnS[s.charAt(i) - 'a']++;
int left = i - len + 1 ;
if (left < 0) continue;
if(Arrays.equals(cnS,cnP)){
ans.add(left);
}
//可以理解为左端点出,因为维护的是一个固定长度的子串字符个数
cnS[s.charAt(left) - 'a']--;
}
return ans;
}
}