力扣剑指offer II 015——字符串中的所有变位词

思路:滑动窗口

窗口的大小为字符串p的长度,用两个长度为26的数组S和P(题目中说了s 和 p 仅包含小写字母,所以用大小为26的数组即可),分别来装滑动窗口中的字母和字符串p中的字母,然后比较数组S和P是否相等,然后滑动窗口,更新数组S中的值继续比较S与P

数组SP的作用相当于桶!!!

代码:

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        int sl=s.size(),pl=p.size();
        if(sl<pl) return {};
        vector<int>S(26,0);//定义数组S用来放字符串s中的字符(题目中说s 和 p 仅包含小写字母,所以用26即可)
        vector<int>P(26,0);//定义数组P用来放字符串p中的字符
        vector<int>res;
        for(int i=0;i<pl;i++){
            S[s[i]-'a']++;
            P[p[i]-'a']++;
        }
        if(S==P) res.push_back(0);
        for(int i=0;i<sl-pl;i++){//移动滑动窗口
            S[s[i+p.size()]-'a']++;//窗口右边界元素++
            S[s[i]-'a']--;//窗口左边界元素--
            if(S==P) res.push_back(i+1);//此时的窗口为移动之后的,所以要i+1

        }
        return res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值