利用滑动窗口+哈希表进行实现
public List<Integer> findAnagrams(String s, String p) {
ArrayList<Integer> list = new ArrayList<>();
int s_length = s.length();
int p_length = p.length();
int s_map[] = new int[26];
int p_map[] = new int[26];
if(s_length < p_length){
return list;
}
//建表计数
for (int i = 0; i < p_length; i++) {
s_map[s.charAt(i) - 'a']++;
p_map[p.charAt(i) - 'a']++;
}
//判断第一个窗口
if(func(s_map, p_map)){
list.add(0);
}
int left = 0;
int right = p_length - 1;
//开始滑动 left和right ++ 同时向右滑动
while(right < s_length - 1){
//需要将之前的hash表数值变为0,否则会因为func函数判断出错
s_map[s.charAt(left) - 'a']--;
left ++;
right ++;
s_map[s.charAt(right) - 'a'] ++;
if(func(s_map, p_map)){
list.add(left);
}
}
return list;
}
//判断是否是字母异位词
public boolean func(int[] s,int[] p){
int[] ints = new int[26];
for (int i = 0; i < 26; i++) {
if(s[i] != p[i]){
return false;
}
}
return true;
}