题目:438. 找到字符串中所有字母异位词
思路:用哈希表mp来记录字符串p中的所有字符情况,ans来记录字符的种类数。然后双指针遍历字符串s,细节看注释,时间复杂度0(n)
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int> v;
//记录字符串p中的所有字符情况
unordered_map<char,int> mp;
//记录字符的种类数
int ans=0;
for(auto x:p){
mp[x]++;
if(mp[x]==1) ans++;
}
//双指针遍历字符串s
for(int i=0,j=0;i<s.size();i++){
mp[s[i]]--;
//如果当前为0,说明满足一种字符的数量要求
if(mp[s[i]]==0) ans--;
//如果有存在<0的情况,说明多了一个字符
while(mp[s[i]]<0){
mp[s[j]]++;
//如果为1,说明“满足一种字符的数量要求”已被打破
if(mp[s[j]]==1) ans++;
j++;
}
//为0,说明[j,i]是符合要求的区间
if(ans==0) v.push_back(j);
}
return v;
}
};