Leetcode 438. 找到字符串中所有字母异位词 (中等)双指针(滑动窗口)

Simulink Test Sequence自动化测试实战:从Excel到模型验证 本文详细介绍了如何利用Excel和MATLAB脚本实现Simulink Test Sequence的自动化测试。通过设计结构化Excel模板管理测试数据,并调用Simulink Test API批量创建与执行测试用例,该方法能显著提升复杂模型单元测试的效率,便于集成到CI/CD流程,实现从数据到验证的全自动化。 阅读详情

题目描述:

给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。

字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。

说明:

    字母异位词指字母相同,但排列不同的字符串。
    不考虑答案输出的顺序。

示例 1:

输入:
s: "cbaebabacd" p: "abc"

输出:
[0, 6]

解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的字母异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的字母异位词。

 示例 2:

输入:
s: "abab" p: "ab"

输出:
[0, 1, 2]

解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的字母异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的字母异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的字母异位词。

来源:力扣(LeetCode)
 

思路:

滑动窗口算法的思路是这样:(摘自 labudadong 公众号)

1、我们在字符串 S 中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为一个「窗口」。

2、我们先不断地增加 right 指针扩大窗口 [left, right],直到窗口中的字符串符合要求(包含了p 中的所有字符)。

3、此时,我们停止增加 right,转而不断增加 left 指针缩小窗口 [left, right],直到窗口中的字符串不再符合要求(不包含p 中的所有字符了)。同时,每次增加 left,我们都要更新一轮结果。

4、重复第 2 和第 3 步,直到 right 到达字符串 S 的尽头。

本题中,我们需要在第3步开始对此时窗口的长度进行计算,看是否与p的长度相等(即异位词)。

//双指针————滑动窗口

class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> res;
        unordered_map<char,int> window;
        unordered_map<char,int> target;

        int left = 0;
        int right = 0;
        int match_cnt = 0;

        for(char c : p)//记录 p中各个字符的出现次数
            target[c]++;
        
        while(right < s.size())//当right走到最后时,循环结束
        {
            char c1 = s[right];
            if(target.count(c1))
            {
                window[c1]++;
                if(window[c1] == target[c1])
                    ++match_cnt;
            }
            ++right;

            while(match_cnt == target.size())//此时窗口中的字符满足p中的要求
            {
                if(right-left == p.size()){
                    res.push_back(left);
                }

                char c2 = s[left];
                if(target.count(c2))
                {
                    window[c2]--;
                    if(window[c2] < target[c2])
                        --match_cnt;
                }
                ++left;
            }
        }
        return res;
    }
};
VCS的增量和分离编译 vcs的增量和分离编译 阅读详情

相关推荐

Simplicity Studio V5与EFR32BG22蓝牙开发环境实战指南

本文详细介绍了Simplicity Studio V5集成开发环境与EFR32BG22蓝牙芯片的开发实战指南。内容涵盖开发环境安装、SDK配置、项目创建、调试烧录、外设驱动集成及常见问题解决方案,帮助开发者快速上手物联网蓝牙应用开发,并充分利用EFR32BG22的低功耗与高集成度特性。

v5w6x的博客 320

labuladong算法小结

1. 数据结构的存储方式 2. 数据结构基本操作——遍历+访问 线性 ​ for/while void traverse(int[] arr) { for (int i = 0; i < arr.length; i++) { // 迭代访问 arr[i] } } 非线性 ​ 递归 链表遍历框架 兼具迭代和递归结构: class ListNode{ int val; ListNode next; } void traverse(ListNod

limx的博客 1万+

地理空间坐标系统-不同椭球基准间的坐标转换

基于同一个椭球基准,可以构建三类地理空间坐标系:大地球面坐标系、大地空间直角坐标系、大地投影坐标系。由于坐标原点和椭球长短半径等都相同,这三类坐标系之间可以通过无损的数学方法相互之间进行转换。那么现在问题来了,不同椭球基准(在全球范围来看存在成百上千的椭球基准)之间的坐标怎么转换?比如,北京54、西安80、国家2000,特别是在我国,现在主推国家2000坐标系,那么如何将历史的测绘成果(北京54和...

技术改变世界 8336

算法刷题指南,来自GitHub 68.8k star的硬核算法教程

很多朋友害怕算法,其实大可不必,算法题无非就那几个套路,一旦掌握,就会觉得算法实在是太朴实无华且枯燥了! 本文选自硬核算法教程《labuladong的算法小抄》,带你学习套路,把握各类算法问题的共性! 数据结构是工具,算法是通过合适的工具解决特定问题的方法。对于任何数据结构,其基本操作无非遍历 + 访问,再具体一点就是:增、删、查、改。 那么该如何在力扣刷题呢?很多文章都会告诉你“按标签刷”“坚持下去”等。不说这些不痛不痒的话,直接给具体的建议。 先刷二叉树 先刷二叉树 !!先刷二叉树...

博文视点(北京)官方博客 1236

Vue3项目实战:集成h265webjs打造高性能Web端H.265播放器

本文详细介绍了如何在Vue3项目中集成h265webjs库,构建高性能的Web端H.265播放器。通过封装播放器管理模块、利用Vue3组合式API优雅管理生命周期,并提供了从环境准备、核心集成到进阶优化的完整实战指南,有效解决了浏览器原生不支持H.265解码的难题,显著降低视频流带宽占用。

weixin_29016833的博客 361

UserWarning: CUDA initialization: Unexpected error from cudaGetDeviceCount()【已解决】

UserWarning: CUDA initialization: Unexpected error from cudaGetDeviceCount()【已解决】

围炉夜敲的博客 1万+

动态规划学习笔记(来自:labuladong的算法小抄)

1. 动态规划一般形式:求最值 2. 核心问题:穷举 3. 三要素: 重叠⼦问题:需要「备忘录」 或者「DP table」 来优化穷举过程, 避免不必要的计算 最优⼦结构:子问题相互独立,可通过子问题最值得到原问题最值 状态转移⽅程(最困难):思考方法:明确「状态」 -> 定义 dp 数组/函数的含义 -> 明确「选择」 -> 明确 base case 4. 经典问题:斐波那契数列问题(重叠子问题) 递归形式如下: int fib(int N) { if (N == 1 || N =

Axe涛的博客 851

保姆级教程:2026版Windows电脑换新,微信QQ聊天记录无损搬家(附路径修改避坑指南)

本文提供2026版Windows电脑换新时微信QQ聊天记录无损迁移的保姆级教程,涵盖最新版微信/QQ的存储路径修改和避坑指南。通过详细步骤和实战技巧,确保数据迁移过程中不丢失任何珍贵对话记录和文件,特别适合需要保留完整聊天记录的用户。

weixin_42629815的博客 2478

算法学习笔记:labuladong--滑动窗口

算法技巧的思路非常简单,就是维护一个窗口,不断滑动,然后更新答案 int left = 0, right = 0; while (right < s.size()) { // 增大窗口 window.add(s[right]); right++; while (window needs shrink) { // 缩小窗口 window.remove(s[left]); left++; } } 这个算法技巧的时

qq_41306849的博客 1593

LVGL 组件对齐方式说明

本文说明 LVGL(以 v8 为例)中常用的 lv_align_t对齐选项的含义与用法,对应界面设计工具里下拉列表中的以及等命名。

摸鱼专家 130

245. 项目195:简易文字冒险游戏——《跟老吕学Python·新手》

如果您在学习本专栏教程时遇到任何问题,或有任何技术交流的意愿,欢迎在文章评论区留言,或通过优快云私信与老吕取得联系。老吕将及时回复您的留言,并与您共同探讨,以期为大家提供更为精准和有效的帮助。老吕珍视每一位读者的反馈和支持,期待与您共同学习、共同进步,共同创造美好的未来!我们的目标是不仅教会您Python语言,更是培养您解决问题的思维方式。请随意翻阅,按照自己的节奏学习,让这本专栏成为您编程旅程中的可靠伙伴。开发一个简易的文字冒险游戏,通过文本描述场景和事件,让玩家通过选择不同的选项来推动故事发展。

Python老吕的博客 711

力扣labuladong一刷day35天

看似都满足,其实不是的,6归属于10的右子树,但是却比10小,这也就是说每一个root只管的了他的左右孩子,但没法把约束root的信息传递给左右孩子,所以我们在遍历的时候就要携带上root的约束范围向下传递。③、有两种删除方法,可以拿当前节点的左子树中最大值(即一路p=p.right)进行交换,然后递归删除,也可以拿当前节点的右子树中的最小值(即一路p=p.left)进行交换,然后递归删除。思路:其实对于二叉搜索树的查找、新增、修改都是一样的思路,对于删除却不一样,有3中可能性,①、要删除节点为叶子节点。

qq_43511039的博客 591

为YOLOv11引入加权双向特征金字塔(BiFPN)

本文介绍了将BiFPN应用于YOLOv11模型以提升边缘设备上小目标检测精度的实践。针对传统FPN在特征融合时的信息丢失问题,采用带可学习权重的BiFPN结构进行改造,实现了不同层级特征的动态融合。重点阐述了WeightedFeatureFusion模块的实现细节、neck结构改造方法及训练部署注意事项。实验表明,该改进使小目标AP提升3.1%,参数量仅增加5%,在精度和效率间取得良好平衡。文章还分享了权重初始化、归一化处理等实用技巧,并强调需根据数据特性评估改进效果,重新计算anchor等关键点。

as1225120794的博客 349

【优选算法】滑动窗口——leetcode——438.找到字符串中所有字母异位词

STL(Standard Template Library): 向量 vector 是 STL 的一部分,提供动态数组的功能。 范围 for 循环: C++11 引入的循环方式,简化了遍历操作。 字符数组与频率统计: 使用数组来记录字符出现的频率,并进行简单的数学运算实现高效统计。 双指针(Sliding Window)技巧: 通过两个指针控制一个窗口,用于高效地处理子串问题。 成员函数与类: 通过类和成员函数组织代码,方便管理和调用。

小李很执着的博客 1888

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

力扣438. 找到字符串中所有字母异位词(滑动窗口)

力扣438. 找到字符串中所有字母异位词(滑动窗口)

LNsupermali的博客 1388

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++ 力扣 438.找到字符串中所有字母异位词 题解 优选算法 滑动窗口 每日一题

本文围绕LeetCode 438题“找到字符串中所有字母异位词”展开解析。该题是滑动窗口在字符串匹配场景的经典应用,核心是寻找s中所有为p的字母异位词的子串起始索引。 文章先拆解题目,明确“子串长度与p相同、字符频率完全一致”的关键约束。接着对比暴力解法的低效,引出固定滑动窗口思路:用数组统计p和窗口字符频率,通过动态更新窗口边界字符频率,结合count变量快速判断匹配。 还详解代码实现细节,总结常见坑点,并对比同类题目滑动窗口应用差异,为后续类似问题提供解题思路。

Q741_147的博客 1176

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

力扣解题-438. 找到字符串中所有字母异位词

第一次解答的“排序对比”思路逻辑直观,但排序带来的O(m×logm)开销导致时间复杂度极高,仅适用于极小数据量,无法满足题目要求;第二次解答的“字符计数”思路是本题的最优解:利用异位词的字符频次特性,用固定长度的数组替代排序,将时间复杂度优化至O(n),是“空间换时间”的经典应用;放弃“排序后对比”的直观思路,转而利用“字符频次相等”的本质特征,通过高效的计数操作替代高开销的排序操作。

qq_38261626的博客 982

LeetCode-438. 找到字符串中所有字母异位词【哈希表 字符串 滑动窗口】

除了直接比较数组是否相等外,其实还可以用双指针来表示滑动窗口的两侧边界,当滑动窗口的长度等于p的长度时,表示找到一个异位词,两种方式的时间复杂度都是O(n)级别的。起始索引等于 0 的子串是 “cba”, 它是 “abc” 的异位词。起始索引等于 6 的子串是 “bac”, 它是 “abc” 的异位词。起始索引等于 0 的子串是 “ab”, 它是 “ab” 的异位词。起始索引等于 1 的子串是 “ba”, 它是 “ab” 的异位词。起始索引等于 2 的子串是 “ab”, 它是 “ab” 的异位词。

zik的博客 1133

【优选算法必刷100题】第014题(同向双指针:滑动窗口算法):找到字符串中所有字母异位词

🔥❄⭐️。

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 1634

踩坑记录[9]——LeetCode 438题:找到字符串中所有字母异位词

给你两个字符串s1和s2,写一个函数来判断s2是否包含s1的排列。如果是,返回true;否则,返回false。换句话说,s1的排列之一是s2的。给定两个字符串s和p,找到s中所有p的的子串,返回这些子串的起始索引。不考虑答案输出的顺序。指由相同字母重排列形成的字符串(包括相同的字符串)。和p仅包含小写字母。

shenfenxihuan的博客 1253

【滑动窗口与双指针】【定长滑窗】—438. 找到字符串中所有字母异位词

本文介绍了使用定长滑动窗口算法解决字符串异位词匹配问题(LeetCode 438)。核心思路是维护两个哈希表分别记录模式串p和当前窗口的字符频率,通过滑动窗口机制逐个比较。关键点包括:1)初始化时构建首个窗口;2)窗口滑动时动态更新字符统计;3)清除频率为0的键避免误判;4)直接比较哈希表判断异位词。Python实现中需注意边界条件(p比s长时直接返回空列表)和哈希表比较时处理零值键。算法时间复杂度主要取决于字符串长度,通过定长滑动窗口优化了暴力解法的性能。

weixin_50512050的博客 927

LeetCode 热题 100 —— 岛屿数量(图论) + 找到字符串中所有字母异位词(滑动窗口)

LeetCode 热题 100 —— 岛屿数量(图论) + 找到字符串中所有字母异位词(滑动窗口)

wahaha51的博客 1517

【438. 找到字符串中所有字母异位词】两种写法写滑动窗口

本文讨论了LeetCode 438题"找到字符串中所有字母异位词"的两种解法: 滑动窗口+排序比较法: 维护固定长度的滑动窗口,窗口大小等于p的长度 使用map记录窗口和p的字符频次 通过比较排序后的频次表判断异位词 时间复杂度O(n*mlogm),空间复杂度O(m) 滑动窗口+哈希表+匹配计数优化: 使用双指针维护窗口 引入cnt变量动态记录匹配字符数 当cnt等于p的字符种类数时即为异位词 时间复杂度优化至O(n),空间复杂度O(m) 两种方法都采用滑动窗口思想,第二种方法通过匹配计

通过输出内容提升自己 843

LeetCode 438. 找到字符串中所有字母异位词 - 滑动窗口与哈希计数详解

题目描述:给定两个字符串 s 和 p,找出 s 中所有与 p 互为字母异位词的子串的起始索引。字母异位词指由相同字符、相同频次构成的字符串,顺序可以不同。返回所有起始索引的列表,按升序排列。原题链接:https://leetcode.cn/problems/find-all-anagrams-in-a-string/难度等级:Medium相关标签:字符串、滑动窗口、哈希表、双指针| 解法 | 时间复杂度 | 空间复杂度 | 优点 | 缺点 | 适用场景 |

m0_52114506的博客 1031

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

438. 找到字符串中所有字母异位词。给定两个字符串s和 p,找到s中所有p的异位词的子串,返回这些子串的起始索引。不考虑答案输出的顺序。异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。

weixin_48323589的博客 1368

LeetCode 热题 100 之 438.找到字符串中所有字母异位词

本文介绍了寻找字符串中所有异位词子串的高效算法。核心思路是利用滑动窗口和字符频次统计,通过维护一个与目标字符串长度相同的窗口,比较窗口内字符频次是否匹配。文章详细阐述了三种优化方案:初始的双数组频次比较、引入count变量减少比较次数,以及最优化的单数组差值频次统计方法。最后介绍的创新方案通过计算窗口与目标字符串的字符频次差值,仅需维护一个differ变量统计不匹配字符数,当differ=0时即为异位词,将时间复杂度优化至O(n)。该算法有效解决了异位词检测问题,适用于大规模字符串处理场景。

2401_87662859的博客 1035
上一篇: Leetcode 76. 最小覆盖子串(困难)双指针中的滑动窗口技巧
下一篇: Leetcode 3. 无重复字符的最长子串(中等)双指针(滑动窗口)
Perrysky
博客等级 码龄11年 16粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值