原题链接:438. 找到字符串中所有字母异位词
solution:滑动窗口(双指针)
//注释写的很清楚了
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
unordered_map<char,int> hash; //保存目标串的种类
vector<int> res; //保存返回值
//加入目标串p = "abcaab"
//则hash[a] = 3 -- hash[b] = 2 -- hash[c] = 1
//种类有abc三种,a的数量为3,b为2,c为1
for(auto &x : p) hash[x]++;
int tot = hash.size(); //保存p的字母种类数量
/*在本次滑动窗口中,向右移动代表新增一个字母和删除一个就字母
新滑入窗口的字母对应哈希表中的字母--,滑出去的字母对应哈希表中的字母++
一旦哈希表中对应的字母数量减为0,代表对应的种类数加1,因此在本次滑动窗口中还要
维护一个种类数目,一旦种类数目等于p的种类数目,相当于有一个异位词*/
int n = p.size(); //窗口长度
for(int i = 0,j = 0,kinds = 0;i < s.size();i++) {
hash[s[i]]--;
if(hash[s[i]] == 0) kinds++; //数量等于0种类数目++
while(i - j + 1 > n) { //滑动窗口
if(hash[s[j]] == 0) kinds--;//将之前的字母移除窗口,移除后对应字母不满足种类,需要kinds--
hash[s[j++]]++; //新增后不为0,所以不满足种类
}
if(kinds == tot) res.push_back(j); //如果种类数等于目标串种类数则保存
}
return res;
}
};