个人主页: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;}
};