题目描述

思路
主要的难点是如何节约时间,采取滑动窗口的思想,有以下需要注意的点:
- 根据s和p都只包含小写字母 可以直接采取26长度的数组保存每个字符的数量
- 判断截取的字符串是否为p的异位词,直接比较两个数组是否相同(相同说明每个字母对应的总数相同 即为异位词)
- 滑动窗口思想在于,窗口长度肯定为p的长度,于是先初始化
- 然后每次后移一位,后移一位即第一个字母删除,增加后移一位的字母(这里的体现就是修改数组)
- 移动完判断数组是否相同,相同就放入结果集合中
java
class Solution {
public List<Integer> findAnagrams(String s, String p) {
List<Integer>res=new ArrayList<>();
if(p.length()>s.length()){
return res;
}
int[] pl = new int[26];//存放对照的字符串的每个字母的总数
int[] sl = new int[26];//长串每次截取的字符串的每个字母总数
for (int i = 0; i < p.length(); i++) {//初始化
pl[p.charAt(i) - 'a']++;
sl[s.charAt(i) - 'a']++;
}
if(Arrays.equals(pl,sl)){
res.add(0);
}
for (int i = 0; i < s.length()-p.length(); i++) {
sl[s.charAt(i) - 'a']--;
sl[s.charAt(i+p.length()) - 'a']++;//后移的逻辑
if(Arrays.equals(pl,sl)){//判断是否为异位词
res.add(i+1);
}
}
return res;
}
}