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;
相关推荐
深圳市方中禾科技1 小时前
FZH1625 LCD 驱动芯片深度评测与实战指南
算法·led
我不会起名字3221 小时前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣
huang5791473 小时前
哈希算法的抗碰撞机制与安全性增强策略4
算法
林浩杨_3 小时前
SIGIR 2026|南京大学:Video-GAR:“通过生成 Query 来验证视频语义理解”的生成增强范式
论文阅读·人工智能·算法
Elsa️7464 小时前
算法一周刷题总结
c++·算法
小小程序猴14 小时前
深圳乘路资讯AI培训怎么样?课程靠谱吗?——一套课程可信度评估模型与实证分析
人工智能·算法
云上先途4 小时前
标签化服务适合哪些人?常见适用场景一次讲清
大数据·人工智能·算法·音视频
彧azz5 小时前
DFS与BFS:图遍历的两大核心算法
数据结构·学习·算法·深度优先·广度优先
Tisfy5 小时前
LeetCode 0836.矩形重叠:xy两方向分别看
数学·leetcode·题解·模拟
宣宣猪的小花园.5 小时前
【机器学习】损失函数与梯度下降:机器如何通过“犯错”不断变好
人工智能·算法·机器学习