本题源自leetcode
---------------------------------------------------------------------------
思路:
1 把在p中出现的字符都映射到一个vector中。然后遍历s字符串。每次保持窗口大小为p.size()
2 如果s中当前窗口出现的字符映射和p一样,j就把起始索引存起来。依次遍历。每次遍历一个新的字符,都要保证窗口大小始终是p.size();
代码:
vector<int> findAnagrams(string s, string p) {
vector<int> sv(26,0);
vector<int> pv(26,0);
vector<int> result;
for(int i=0; i<p.size();i++){
sv[s[i]-'a']++;
pv[p[i]-'a']++;
}
if(pv==sv)
result.push_back(0);
for(int i=p.size();i<s.size();i++){
//从左向右,遍历。每次遍历一个保持窗口大小为p.size()
sv[s[i]-'a']++;
//去除窗口最左边的元素
sv[s[i-p.size()]-'a']--;
if(pv==sv)
result.push_back(i-p.size()+1);
}
return result;
}
代码2: 256 个字符
vector<int> findAnagrams(string s, string p) {
vector<int> sv(256,0);
vector<int> pv(256,0);
vector<int> result;
for(int i=0; i<p.size();i++){
sv[s[i]]++;
pv[p[i]]++;
}
if(pv==sv)
result.push_back(0);
for(int i=p.size();i<s.size();i++){
//从左向右,遍历。每次遍历一个保持窗口大小为p.size()
sv[s[i]]++;
//去除窗口最左边的元素
sv[s[i-p.size()]]--;
if(pv==sv)
result.push_back(i-p.size()+1);
}
return result;
}