思路
hash table + sliding window
分别建立对于s和p的hash table,大小为26。首先建立p的hash table,然后遍历s中的字符,建立s的hash table并且每加入一个新字符+去掉一个旧字符的同时,比较s_map和p_map的内容(耗时O(26) => O(1)),如果一致就将开头的索引加入结果list。
复杂度
时间复杂度O(n*26) = O(n), 空间复杂度O(n+m)
代码
class Solution {
public List<Integer> findAnagrams(String s, String p) {
List<Integer> ans = new ArrayList<>();
int slen = s.length(), plen = p.length();
if(slen == 0 || plen == 0)
return ans;
int[] p_map = new int[26], s_map = new int[26];
char[] sc = s.toCharArray(), sp = p.toCharArray();
for(char c : sp) {
p_map[c - 'a']++;
}
for(int i = 0; i < slen; i++) {
if(i >= plen) {
s_map[sc[i - plen] - 'a']--;
}
s_map[sc[i] - 'a']++;
boolean isEqual = true;
for(int j = 0; j < 26; j++) {
if(s_map[j] != p_map[j]) {
isEqual = false;
}
}
if(isEqual) ans.add(i - plen + 1);
}
return ans;
}
}