找到字符串中所有字母异位词--滑动窗口

2023-12-23 19:16:59

?个人主页:Lei宝啊?

愿所有美好如期而遇


本体题目链接icon-default.png?t=N7T8https://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;
    }
};

文章来源:https://blog.csdn.net/m0_74824254/article/details/135171029
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。