思路:滑动窗口
窗口的大小为字符串p的长度,用两个长度为26的数组S和P(题目中说了s 和 p 仅包含小写字母,所以用大小为26的数组即可),分别来装滑动窗口中的字母和字符串p中的字母,然后比较数组S和P是否相等,然后滑动窗口,更新数组S中的值继续比较S与P
数组S和P的作用相当于桶!!!
代码:
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int sl=s.size(),pl=p.size();
if(sl<pl) return {};
vector<int>S(26,0);//定义数组S用来放字符串s中的字符(题目中说s 和 p 仅包含小写字母,所以用26即可)
vector<int>P(26,0);//定义数组P用来放字符串p中的字符
vector<int>res;
for(int i=0;i<pl;i++){
S[s[i]-'a']++;
P[p[i]-'a']++;
}
if(S==P) res.push_back(0);
for(int i=0;i<sl-pl;i++){//移动滑动窗口
S[s[i+p.size()]-'a']++;//窗口右边界元素++
S[s[i]-'a']--;//窗口左边界元素--
if(S==P) res.push_back(i+1);//此时的窗口为移动之后的,所以要i+1
}
return res;
}
};