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;
相关推荐
和鲸社区2 小时前
四大经典案例,入门AI算法应用,含分类、回归与特征工程|2025人工智能实训季初阶赛
人工智能·python·深度学习·算法·机器学习·分类·回归
dragoooon342 小时前
[优选算法专题二——NO.16最小覆盖子串]
c++·算法·leetcode·学习方法
点云SLAM2 小时前
四元数 (Quaternion)在位姿(SE(3))表示下的各类导数(雅可比)知识(2)
人工智能·线性代数·算法·机器学习·slam·四元数·李群李代数
汉克老师2 小时前
第十四届蓝桥杯青少组C++选拔赛[2023.1.15]第二部分编程题(4 、移动石子)
c++·算法·蓝桥杯·蓝桥杯c++·c++蓝桥杯
Athenaand3 小时前
代码随想录算法训练营第62天 | Floyd 算法精讲、A * 算法精讲 (A star算法)、最短路算法总结篇、图论总结
算法·图论
qq_433554543 小时前
C++ Dijkstra堆优化算法
开发语言·c++·算法
楼田莉子5 小时前
C++动态规划算法:斐波那契数列模型
c++·学习·算法·动态规划
1373i5 小时前
【Python】通俗理解反向传播
深度学习·算法·机器学习
Madison-No75 小时前
【C++】日期类运算符重载实战
c++·算法