?个人主页:Lei宝啊?
愿所有美好如期而遇
本体题目链接https://leetcode.cn/problems/VabMRr/description/
滑动窗口其实就是种双指针,只是这种双指针只向后移动,不会回退,具有单调性,也就是说,整个过程中left和right只会++。?
本题思路我们通过图示来明晰。
?
?
后面不再画。?
class Solution
{
public:
vector<int> findAnagrams(string s, string p)
{
vector<int> v;
vector<int> hash1(26);
vector<int> hash2(26);
for(int i=0; i<p.size(); i++)
{
hash2[p[i]-97]++;
}
int count = 0;
for(int rhs = 0, lhs = 0; rhs < s.size(); rhs++)
{
int ra = s[rhs]-97;
int rb = s[lhs]-97;
//进窗口
hash1[ra]++;
//判断
//进窗口的对应位置的字符的数量小于等于hash2中对应位置的字符数量,有效字符数++
if(hash1[ra] <= hash2[ra])
{
count++;
}
int len = rhs - lhs + 1;
while(len > p.size())
{
//出的数据是有效字符时,我们count--
if(hash1[rb] <= hash2[rb])
{
count--;
}
//出窗口
hash1[rb]--;
len--;
lhs++;
}
if(count == p.size()) v.push_back(lhs);
}
return v;
}
};