LeetCode - 438. Find All Anagrams in a String & 567. Permutation in String

本文介绍了解决字符串中寻找另一字符串所有排列的问题,通过使用滑动窗口和计数数组的方法,实现高效查找并返回所有匹配的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题代码:

438:

classSolution {

public:

    vector<int> findAnagrams(string s,string p) {

        vector<int> res;

        vector<int> pp(26,0),ss(26,0);

        if(p.size()>s.size())

            return res;

        for(int i=0;i<p.size();i++){

            pp[p[i]-'a']++;

            ss[s[i]-'a']++;

        }

        if(pp==ss)

            res.push_back(0);

        for(int i=p.size();i<s.size();i++){

            ss[s[i]-'a']++;

            ss[s[i-p.size()]-'a']--;

            if(pp==ss)

                res.push_back(i-p.size()+1);

        }

        return res;

    }

};


567:

classSolution {

public:

    bool checkInclusion(string s1, string s2) {

        if(s2.size()<s1.size())

            return false;

        vector<int> s(26,0),t(26,0);

        for(int i=0;i<s1.size();i++){

            s[s1[i]-'a']++;

            t[s2[i]-'a']++;

        }

        if(s==t)

            return true;

        for(inti=s1.size();i<s2.size();i++){

            t[s2[i]-'a']++;

            t[s2[i-s1.size()]-'a']--;

            if(s==t)

                return true;

        }

        return false;

    }

};

 

解题思路:

将这两题放在一起的原因是两题比较相似,都是关于一个字符串中是否存在另一个字符串的其他排列。不同的是,567只需要判断是否存在,而438需要找出位置。

由于字符串只包含小写字母,因此,建立两个长度为26的数组,分别对应26位小写字母。由于只需要求是否存在相应的排列,所以也相当于求包含对应字母的数量是否相等。先把字符串一中各个字母的个数记录于数组一,假设字符串一长度为k,先把字符串二中前k个字符的字母个数情况输入数组二中,然后进行对比,若两个数组相同,则表示字符串二的前k位是字符串一的另一种排列方式或相同。若不相同则表示不是。然后从字符串二的第k+1位开始,逐个添加对应字母的个数,假设为第i位,并减去第i-k的字母,保证数组二中表示的是连续的k个字符的字母个数情况。而且进行两个数组间的对比。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值