很简单的一个题,看数据量到达了10^4,应该是一个代码复杂一点的O(n)的时间复杂度
想到滑动窗口这个题目就基本解决了,
先特判 如果p.size() > s.size() 返回空
之后把p的字符作为+,s的字符记为-,当数组26为全0标志着 应该把该索引加入
之后滑动窗口 在遇到下一个s的字符的时候, 减减
对于被滑出s的字符 , 加加 这个要想清楚
代码:
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int> ans;
if(s.size()<p.size()) return ans;
int sp[26];
memset(sp,0,sizeof(sp));
for(auto it : p){
sp[it-'a']++;
}
for(int i=0;i<p.size();i++){
sp[s[i]-'a']--;
}
if(test(sp)) ans.push_back(0);
for(int i=p.size();i<s.size();i++){
sp[ s[i]-'a' ]--;
sp[ s[i-p.size()]-'a' ]++;
if(test(sp)) ans.push_back( i-p.size()+1 );
}
return ans;
}
bool test(int sp[]){
for(int i=0;i<26;i++){
if(sp[i]!=0){
return false;
}
}
return true;
}
};