1、题目:找到字符串中所有字母异位词
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
2、解题思路
1、固定滑窗长度为字符串p的长度pLen,用哈希表记录字符串s的滑窗内各字符与字符串p之间的差值(p的该字符数量减s的该字符数量)
2、用differ变量记录所有字符差值的绝对值之和,当differ为0时说明所有字符数量一致,当前滑窗满足要求
3、滑窗每次右移一位时右端字符差值减1,左端字符差值加1,根据新差值的符号判断differ的变化
3、代码
class Solution
{
public:
vector<int> findAnagrams(string s, string p)
{
int sLen=s.size(),pLen=p.size();
if(sLen<pLen)
return {};
int pChar[26]{};
int l=0,r=0,differ=0;
while(r<pLen)
{
--pChar[s[r]-97];
++pChar[p[r]-97];
++r;
}
for(int i=0;i<26;++i)
differ+=abs(pChar[i]);
vector<int> ans;
while(r<sLen)
{
if(differ==0)
ans.emplace_back(l);
--pChar[s[r]-97];
differ+= pChar[s[r]-97]<0 ? 1:-1;
++pChar[s[l]-97];
differ+= pChar[s[l]-97]>0 ? 1:-1;
++r;
++l;
}
if(differ==0)
ans.emplace_back(l);
return ans;
}
};