跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

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

讲解 LeetCode 第 38 题“找到字符串中所有字母异位词”的解法。核心思路是使用滑动窗口结合频率数组统计字符出现次数。首先统计目标字符串 p 的字符频率,然后在源字符串 s 上维护一个长度为 p.size() 的滑动窗口,动态更新窗口内字符频率并与 p 对比。若一致则记录起始索引。需注意边界条件处理及窗口扩张与收缩的顺序。

字节跳动发布于 2026/3/29更新于 2026/10/26113 浏览
class Solution {
public:
    vector<int> findAnagrams(string s, string p) {
        vector<int> result;
        vector<int> pf(26,0);
        vector<int> sf(26,0);
        int len_p=p.size();
        int len_s=s.size();
        for(char c:p){
            pf[c-'a']++;
        }
        if(len_s<len_p) return result; // 先处理边界问题,边界问题放到循环外部。
        // 遍历整个 s
        for(int right=0;right<len_s;right++){
            // 先写窗口扩张代码
            sf[s[right]-'a']++;
            // 再写窗口收缩条件代码
            if(right>=len_p){
                sf[s[right-len_p]-'a']--;
            }
            if(right>=len_p-1){
                if(sf==pf){
                    result.push_back(right-len_p+1);
                }
            }
        }
        return result;
    }
};

思路

  1. 统计 p 的字母频率:用长度为 26 的数组(或哈希表)记录 p 中每个字母的出现次数。 本题用 vector 数组就可以,因为题目说了都是小写字母,哈希表的通用性更强,若字符串包含大小写或非字母字符,数组映射会失效,此时可用 unordered_map<char, int> 统计频率。但是哈希表内存开销大(空间换时间)。
  2. 滑动窗口遍历 s:维护一个长度为 p.size() 的窗口,统计窗口内字母的频率,与 p 的频率对比。 若窗口内字母频率与 p 完全一致,则记录窗口的起始索引。 窗口滑动时,移除左边界字母的计数,添加右边界字母的计数,维护窗口长度不能超过 p.size()。这是写窗口收缩条件代码。

注意要点

  1. 边界检查:if(len_s<len_p) 如果字符串 s 长度小于 p,直接返回空结果。注意不要写 return ;,函数的返回类型是 vector<int>,return 语句必须返回一个 vector 对象。
  2. 滑动窗口逻辑:循环内先写窗口扩张代码,再写窗口收缩条件判断代码,再写窗口铺满后(窗口长度大于等于字符串 p 长度)的条件判断代码。只有当窗口完全形成(长度等于 len_p)时才有比较两个 vector 数组字母频率是否相同的必要。
  3. 索引判断:if(right>=len_p-1) 这个判断条件是因为 right 是从索引 0 的位置开始走的,所以要 -1。例如当 right 为 len_p-1 时,窗口大小为 len_p,刚好满足比较条件。
  4. 学习建议:做题前先理解题目和知识点,尝试编写大体代码。遇到难点可查阅资料或借助工具辅助理解,然后独立复现代码并验证逻辑,避免直接照搬片段代码,以构建完整的算法逻辑体系。

目录

  1. 思路
  2. 注意要点

更多推荐文章

查看全部
  • C++ 多态核心解析:虚函数重写与动态绑定原理
  • Android 中高级面试核心考点汇总与解析
  • AI 大模型新型智算中心技术体系深度分析
  • 无人机电源管理系统:升压降压电路设计
  • Visual C++ 6.0 在 Windows 11 下的安装与兼容性配置
  • 7 个 Python 实战项目代码示例
  • OpenClaw 多机器人协作方案:组建虚拟员工团队
  • 基于 Java 标准库读取 CSV 实现天地图 POI 分类导入 PostGIS 数据库
  • AI 辅助快速生成 Mermaid 图表实战指南
  • Qwen3-VL-WEBUI 地标识别:旅游 AI 助手部署教程
  • 基于 Python 的币安期货交易机器人实战
  • C++ operator() 运算符重载详解
  • 基于 WebGIS 与百度天气接口的复古天气预报系统构建
  • AI 核心概念速通教程
  • 2025 年 AIGC 六大发展趋势与应用场景解析
  • Sharpa Robotics 量产视觉基触觉手 SharpaWave,0.005N 超敏感知 + 模块化设计
  • AI 产品经理学习路线:从零基础到大模型应用实战指南
  • Java 高德地图面检索中 WGS84 坐标转换与 POI 查询实战
  • Java 编译报错:无效的目标发行版 17 与源发行版配置冲突
  • AI 赋能产品经理:提示词框架与工具实战指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online