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;
相关推荐
moshuying3 分钟前
块扩散 + GDN 改造:Clover 把「并行生成」塞进了 Agent 的长上下文里
前端·算法
没落之王16 分钟前
历史系统建模:宋初太祖太宗「再立天庭」秩序重构推演
人工智能·算法·重构
INGNIGHT1 小时前
91 · 最小调整代价(序列dp)
数据结构·算法·leetcode
moshuying1 小时前
扩散模型开始写代码、开网页了:350 亿参数,速度比 Jev 快一倍
前端·算法
小超人诞生日记1 小时前
C++ 异常机制详解:从抛出捕获到异常安全
c++·算法
labuladong2 小时前
机器学习&神经网络 系列教程上线
神经网络·算法·机器学习
xiangyun612 小时前
C++ 手撕 shared_ptr:引用计数与控制块到底长什么样?
开发语言·c++·算法·面试·stl
学习论之费曼学习法2 小时前
无人值守AI内容矩阵实战(8):标题 A/B 实验的 6 个工程实现细节,隔日对比与自动判胜
人工智能·python·算法·矩阵·自动化·a/b测试·内容矩阵
Carl_奕然3 小时前
【机器视觉】最强算法之:3D高斯泼溅(3D Gaussian Splatting)
人工智能·python·算法·目标检测·计算机视觉·3d
w_zero_one3 小时前
算法--桶思想
java·开发语言·算法