思路
这题整体比较简单。最容易想到的就是直接暴力算法,时间复杂度为O(N²)。
随后观察后发现,其实可以使用滑动窗口的方式,每次只添加或者只删除一个字母的计数,那么再加上统计所有字母数字的数组,得到的时间复杂度约为O(26N)。
但是注意到题目中似乎并没有限制p的长度一定小于等于s的长度。在数据中似乎也并没有给出反例。或许是要作为一种特殊情况处理。
最开始的时候还把这个s和p的长度搞反了,导致出现一些错误。
代码
cpp
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int n1=s.size();
int n2=p.size();
vector<int>ans;
vector<int>cnt1(26,0);
vector<int>cnt2(26,0);
if (n1 < n2) return ans;
for(int i=0;i<n2;i++){
cnt2[p[i]-'a']++;
}
int l=0;
for(int i=0;i<n1;i++){
cnt1[s[i]-'a']++;
if(i-l+1==n2){
if(cnt1==cnt2){
ans.push_back(l);
}
cnt1[s[l]-'a']--;
l++;
}
}
return ans;
}
};
总结
这题是一个典型的通过滑动窗口就可以解决的问题。但是在具体代码过程中,需要注意s和p的长度,以及窗口具体的移动方式。整体上比较简单,很很快就可以写出来。