思路
题目要求我们找到异位词,一样开始分析题目,什么是异位词,怎么判段异位词,这是我们解题的开口,不理解这个就做不了,异位词特点,包含的字符相同,只是存在位置不同,
知道特点利用特点判断是不是异位词,那我们只需要记录p字符串所有的字符,然后在s字符串里面找长度相同,包含字符个数一样的字串就行了,所以我们需要利用滑动窗口,来固定窗口大小,然后右移动。
代码
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
int n=p.size();
int m=s.size();
//记录字串大小
vector<int> pcount(26);
vector<int> scount(26);//存储s字符串的字串,用来判断是不是异位词
//记录p的字符个数,后面来判断是不是异位词
vector<int> reslut;
//结果数组
for(int i=0;i<n;i++)
{
pcount[p[i]-'a']++;
}
//记录p字符
int left=0;//滑动窗口左指针
//right位右指针
for(int right=0;right<m;right++)
{
scount[s[right]-'a']++;
//窗口大小合适了
if(right-left+1==n)
{
//判断
if(scount==pcount) reslut.emplace_back(left);
//左指针右移动,保持窗口大小,移除窗口的字符需要删掉
scount[s[left]-'a']--;
left++;
}
}
return reslut;
}
};