LeetCode热题 438.找到字符中所有字母异位词 (滑动窗口)

题目

思路:

这跟 无重复字符的最长子串 所用的算法是一样的,也是维护一个窗口(长度和 p 一样),然后比较这个窗口中的字母出现频率和 p 中字母出现的频率是否一致。然后动态维护的话,窗口每次移动,就把左边出窗的字母的频率减 1 ,后面加进来的字母的频率加 1。然后继续判断,一致就把当前窗口的起始点加进答案。

这里可能有疑问,就是怎么判断字母出现的频率是否一致,我们可以用两个vector,比如加进来一个 c,那我们就把 cnt'c' - 'a' ++ ,然后比较就直接比较两个数组是否想等,因为 vector 重载了 operator==,所以可以直接比较两个数组是不是相同。

直接比较会先比较两个 vector 的 size()。如果长度相同,再逐元素调用对应类型的 operator==,直到出现不想等或者全部比对完。

代码:

复制代码
        int n = s.size(), len = p.size();  

        vector<int> ans;
        if (n < len) return ans;  //  如果要找的异位词 比字符串还长,那就肯定没有

        vector<int> scnt(26), pcnt(26);  //  一个是窗口里的字母频率计数,一个是目标词的字母频率

		//  初始化第一个窗口
        for (int i = 0; i < len; i ++ ){
            scnt[s[i] - 'a'] ++;
            pcnt[p[i] - 'a'] ++;
        }

		//  看是否一致
        if (scnt == pcnt) ans.push_back(0);

		//  右移窗口
        for (int i = 0; i < n - len; i ++ ){
            scnt[s[i] - 'a'] --;
            scnt[s[i + len] - 'a'] ++;

            if (scnt == pcnt) ans.push_back(i + 1);
        }

        return ans;
相关推荐
JieE2126 小时前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2126 小时前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术11 小时前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦12 小时前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户4978630507315 小时前
(一)小红的数组操作
算法·编程语言
怕浪猫18 小时前
Electron 系列文章封面图
算法·架构·前端框架
徐小夕20 小时前
JitWord 3.0 正式发布,高精度Word异构解析+复杂组件兼容,打造web端协同Word编辑器
前端·vue.js·算法
通信小呆呆1 天前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人