力扣每日一题438. 找到字符串中所有字母异位词
滑动窗口算法 具体操作如下:
根据题目要求,我们需要在字符串 s 寻找字符串 p 的异位词。所以我们可以在字符串 s 中构造一个长度为与字符串 p 的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;当窗口中每种字母的数量与字符串 p 中每种字母的数量相同时,则说明当前窗口为字符串 p 的异位词。
详细过程已经注释了。
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
vector<int> res; //累计索引 结果result
int arr1[26]={0},arr2[26]={};
//记录p中含有的字母的个数
for(char c:p) arr1[c-'a']++;
int right = 0,left = 0;
while(right<s.size())
{
//计算滑动窗口一段中 s 的字母个数
arr2[s[right]-'a']++;
if(right-left == p.size()-1)
//如果滑动到与p等长 看是不是所以字母的个数都能够对应
{
bool flag = true;
for(int i=0;i<26;i++)
{
if(arr1[i] != arr2[i])
{
flag = false;
break;
}
}
if(flag) res.push_back(left);
//如果true之后 就返回到原来一个 减去下标为left对应的字母,数量减1
arr2[s[left++]-'a']--;
}
right++;
}
return res;
}
};