题目:
题解:
本题使用滑动窗口解题,滑动窗口属于双指针技巧的最高境界了,本题求的是模式串p在总串s中的所有字母异位词,所以我们所建立的
窗口windows大小
维持在与模式串p生成的字符表needs的大小
相等即可。关于更多滑动窗口的详解:看这里。
代码如下:
class Solution {
public:
vector<int> findAnagrams(string s, string p) {
if(s.size()<p.size())return {};//总串比模式串小,直接返回空
int left=0,right=0;
//ss用来表示窗口windows,pp用来表示needs
//由于本题求的是字符串中的异位词,所以只需保证windows的大小为needs的大小即可
vector<int> ss(26,0),pp(26,0),result;
for(int i=0;i<p.size();++i)//生成needs
{
pp[p[i]-'a']++;
ss[s[right++]-'a']++;
}
//s的前p.size()的字符串刚好与p是异位词
if(ss==pp)result.push_back(left);
//固定滑动窗口的大小
while(right<s.size()){
//窗口右移
ss[s[right++]-'a']++; //窗口右边界右移
ss[s[left++]-'a']--; //窗口左边界右移
if(ss==pp)result.push_back(left);
}
return result;
}
};