题目:
先记录一下(没想到有生之年,还能):其实还能优化,后面会讲述优化思路
思路:
滑动窗口的大小就是固定的,就是len_p。那么依次将窗口从s的最左端向右滑动。在当下的窗口中,判断窗口中s的子串和p串中元素种类及个数是否匹配即可(这里用cnt_s,cnt_p分别记录对应元素的个数)。
代码:
C++:
class Solution {
public:
int cnt_s[26]={0};
int cnt_p[26]={0};
bool check(){
for(int i=0;i<26;i++){
if(cnt_s[i]!=cnt_p[i]){
return false;
}
}
return true;
}
vector<int> findAnagrams(string s, string p) {
vector<int> res;
int len_s=s.size();
int len_p=p.size();
//记录cnt_p
for(int i=0;i<len_p;i++){
cnt_p[p[i]-'a']++;
}
for(int i=0;i<=len_s-len_p;i++){
if(i==0){
for(int j=0;j<len_p;j++){
cnt_s[s[j]-'a']++;
}
}
else{
cnt_s[s[i-1]-'a']--;
cnt_s[s[i+len_p-1]-'a']++;
}
if(check()){
res.push_back(i);
}
}
return res;
}
};
python:
明天继续补充。。。
优化
可以在窗口滑动后,先判断新加入的元素是否属于p串(这里维护一个哈希表),如果不属于,那么左窗口直接跳到新加入元素的下一个位置。