首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【优选算法必刷100题】第014题(滑动窗口):找到字符串中所有字母异位词

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

作者头像
用户11915063
发布2025-11-20 13:11:27
发布2025-11-20 13:11:27
180
举报

前言:

聚焦算法题实战,系统讲解三大核心板块:“精准定位最优解”——优选算法,“简化逻辑表达,系统性探索与剪枝优化”——递归与回溯,“以局部最优换全局高效”——贪心算法,讲解思路与代码实现,帮助大家快速提升代码能力

滑动窗口专题


找到字符串中所有字母异位词

题目链接:

438. 找到字符串中所有字母异位词 - 力扣(LeetCode)

题目描述:

题目示例:

解法(滑动窗口+哈希表):
算法思路:
  • 因为字符串 p 的异位词的长度一定与字符串 p 的长度相同,所以我们可以在字符串 s 中构造一个长度与字符串 p 的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;
  • 当窗口中每种字母的数量与字符串 p 中每种字母的数量相同时,则说明当前窗口为字符串 p 的异位词
  • 因此可以用两个大小为 26 的数组来模拟哈希表,一个来保存 s 中的每个字符出现的个数,另一个来保存 p 中每一个字符出现的个数。这样就能判断两个串是否是异位词

C++代码演示:

代码语言:javascript
复制
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> ret;
        int hash1[26]={0};//统计字符串p中每个字符出现的次数
        for(auto ch:p) hash1[ch-'a']++;
 
        int hash2[26]={0};// 统计窗口里面每个字符出现的个数
        int m=p.size();
        for(int left=0,right=0,count=0;right<s.size();right++)
        {
            char in=s[right];
            //进窗口+维护count
            if(++hash2[in-'a']<=hash1[in-'a']) count++;
            if(right-left+1>m)//判断
            {
                char out=s[left++];
                //出窗口+维护count
                if(hash2[out-'a']-- <= hash1[out-'a']) count--;
            }
            //更新结果
            if(count==m) ret.push_back(left);
        }
        return ret;
    }
};

算法总结&&笔记展示:

博主笔记(字迹有点丑,请大家见谅):


总结:

往期回顾:

【优选算法必刷100题】第009~010题(滑动窗口):长度最小的子数串、无重复字符的最长字串

【优选算法必刷100题】第011~012题(滑动窗口):最大连续1的个数 III,将 x 减到 0 的最小操作数

【优选算法必刷100题】第013题(滑动窗口):水果成篮问题

结语:最新力扣438题解析:字符串字母异位词搜索,附手写解题笔记+代码实现,适合算法进阶学习,如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • 找到字符串中所有字母异位词
    • 解法(滑动窗口+哈希表):
      • 算法思路:
  • C++代码演示:
  • 算法总结&&笔记展示:
  • 总结:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档