假设我们不固定窗口大小:
class Solution {
public:
template <typename K, typename V>
bool areUnorderedMapsEqual(const std::unordered_map<K, V>& map1, const std::unordered_map<K, V>& map2) {
if (map1.size() != map2.size()) {
return false;
}
for (const auto& pair : map1) {
auto it = map2.find(pair.first);
if (it == map2.end() || it->second != pair.second) {
return false;
}
}
return true;
}
vector<int> findAnagrams(string s, string p) {
vector<int> res;
unordered_map<char,int> pmap, smap;
for(auto c: p){
pmap[c]++;
}
int target=pmap.size();
int n=s.size();
int left=0,right=0;
int count=0;
while(right<n){
smap[s[right]]++;
if(smap[s[right]]==pmap[s[right]]){
count++;
}
right++;
while(count==target){
if(areUnorderedMapsEqual(pmap,smap)){
res.push_back(left);
}
if(smap[s[left]]==pmap[s[left]]){
count--;
}
smap[s[left]]--;
left++;
}
}
return res;
}
};
窗口固定:
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int p_size=p.size();
int s_size=s.size();
vector<int> res;
if(p_size>s_size) return res;
vector<int> pDic(26,0);
vector<int> sDic(26,0);
for(int i=0;i<p_size;i++){
pDic[p[i]-'a']++;
sDic[s[i]-'a']++;
}
if(pDic==sDic){res.push_back(0);}
for(int i=p_size;i<s_size;i++){
sDic[s[i-p_size]-'a']--;
sDic[s[i]-'a']++;
if(pDic==sDic){res.push_back(i-p_size+1);}
}
return res;
}
};