题目链接:https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/?envType=study-plan-v2&envId=top-100-liked
滑动窗口
用两个数组存储s和p的异位词,然后s的左右边界依次右移,逐个判断
class Solution {
public List<Integer> findAnagrams(String s, String p) {
int n = s.length();
int m = p.length();
//如果字符串s长度小于p,那么一定不存在异位词,直接返回
if(n < m){
return new ArrayList<Integer>();
}
//存储字符串s的异位词数组
int[] slen = new int[26];
//存储字符串p的异位词数组
int[] plen = new int[26];
//存储答案
List<Integer> ans = new ArrayList<Integer>();
//先判断第一个窗口
for(int i = 0; i < m; i++){
slen[s.charAt(i) - 'a']++;
plen[p.charAt(i) - 'a']++;
}
//判断两个数组是否相等
if(Arrays.equals(slen, plen)){
ans.add(0);
}
//开始遍历剩下的窗口
for(int i = 0; i < n - m; i++){
//左边界右移
slen[s.charAt(i) - 'a']--;
//右边界右移
slen[s.charAt(i + m) - 'a']++;
//判断两个数组是否相等
if(Arrays.equals(slen, plen)){
ans.add(i + 1);
}
}
return ans;
}
}
还剩91题!