解题思路:滑动窗口
三步走 进窗口 判断 出窗口 然后更新结果
定义两个hash表在第一个表中存 p的有效字符 比如 abc a一个 b一个 c一个 这样就存在三个有效字符 在第二个hash表中进行滑动窗口的运行 定义一个常量count 如果滑动窗口中有效字符存在一个就 +1
第二个hash表中 进窗口时候怎么才能算有效字符呢?
hash2[s[right] -'a'] <=hash1[s[right] -'a'] 这个时候 count++
这个条件就是滑动窗口中比如a 有 1个 或者2个 3个等等 但是它不能大于p中a的个数 一旦大于就非有效
之后判断我们滑动窗口大于p的数组长度时候就需要删减
char out=s[left++];
if(hash2[out-'a']<=hash1[out-'a']) count--; 判断出去的是否为有效字符
hash2[out-'a']--; 删减
然后最后一步更新结果 将 count==p.size() 的结果拼接到顺序表之中
代码如下
class Solution {
public:
vector<int> findAnagrams(string s, string p)
{
vector<int> ret;
int hash1[26]={0};//统计p中每个字符出现的个数
for(auto ch:p)
{
hash1[ch-'a']++;
}
int m=p.size();
int hash2[26]={0};//统计窗口里面每一个字符出现的个数
for(int left=0, right=0,count=0 ;right<s.size();right++)
{
char in=s[right];
hash2[in-'a']++;
if(hash2[in-'a']<=hash1[in-'a']) count++;//有效字符就 ++
if(right-left+1>m)
{
char out=s[left++];
if(hash2[out-'a']<=hash1[out-'a']) count--;//判断出去的是否为有效字符
hash2[out-'a']--;
}
if(count==m)
{
ret.push_back(left);
}
}
return ret;
}
};