解题思路:
解决该题最容易理解的方法应该就是滑动窗口了,首先用26位字母固定两个数组,分别统计p的字母个数和s对应长度的字母个数,然后就是s从p的长度开始不断向后添加新的单词并且删除旧的单词,再对比两个数组是否相等,相等就把当前位置放入res数组中,代码如下:
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int n1= s.size(), n2 = p.size();
vector<int> res;
if(n1 < n2) {
return res;
}
vector<int> s_count(26);
vector<int> p_count(26);
// 记录p长度的s和p的单词映射关系
for(int i = 0; i < n2; i ++) {
++ s_count[s[i] - 'a'];
++ p_count[p[i] - 'a'];
}
for(int i = 0; i <= n1 - n2; i ++) {
if(s_count == p_count) {
res.push_back(i);
}
if(i + n2 < n1) {
-- s_count[s[i] - 'a'];
++ s_count[s[i + n2] - 'a'];
}
}
return res;
}
};