438. 找到字符串中所有字母异位词

本文介绍了一种使用滑动窗口算法解决字符串问题的方法,具体应用到寻找字符串中所有字母异位词。通过实例和代码展示了如何利用unordered_map存储字符及其出现次数,并利用双指针动态调整窗口来找出所有与目标字符串p具有相同字母种类数的子串。

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

原题链接:438. 找到字符串中所有字母异位词

solution:滑动窗口(双指针)

//注释写的很清楚了

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        unordered_map<char,int> hash;   //保存目标串的种类
        vector<int> res;    //保存返回值
        //加入目标串p = "abcaab"
        //则hash[a] = 3 -- hash[b] = 2 -- hash[c] = 1
        //种类有abc三种,a的数量为3,b为2,c为1
        for(auto &x : p) hash[x]++;
        int tot = hash.size();  //保存p的字母种类数量
        /*在本次滑动窗口中,向右移动代表新增一个字母和删除一个就字母
          新滑入窗口的字母对应哈希表中的字母--,滑出去的字母对应哈希表中的字母++
          一旦哈希表中对应的字母数量减为0,代表对应的种类数加1,因此在本次滑动窗口中还要
          维护一个种类数目,一旦种类数目等于p的种类数目,相当于有一个异位词*/
        int n = p.size();   //窗口长度
        for(int i = 0,j = 0,kinds = 0;i < s.size();i++) {
            hash[s[i]]--;
            if(hash[s[i]] == 0) kinds++;    //数量等于0种类数目++
            while(i - j + 1 > n) { //滑动窗口
                if(hash[s[j]] == 0) kinds--;//将之前的字母移除窗口,移除后对应字母不满足种类,需要kinds--
                hash[s[j++]]++; //新增后不为0,所以不满足种类
            }
            if(kinds == tot) res.push_back(j);  //如果种类数等于目标串种类数则保存
        }
        return res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值