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

LeetCode 49. 字母异位词分组 C++ 哈希表解法

介绍 LeetCode 第 49 题“字母异位词分组”的 C++ 解决方案。核心思路是利用哈希表,将每个字符串转换为长度为 26 的特征码(统计各字母出现频次),作为键存储对应的原始字符串列表。遍历输入数组,计算特征码并分组,最后返回结果。该方法时间复杂度为 O(N*K),空间复杂度为 O(N*K),其中 N 为字符串数量,K 为平均长度。

奇形怪状发布于 2026/3/27更新于 2026/9/163 浏览
LeetCode 49. 字母异位词分组 C++ 哈希表解法

题目

题目图片

完整代码

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> res;
        unordered_map<string, vector<string>> hash;
        for(auto& i:strs) {
            string count(26,0);
            for(auto& j:i) {
                count[j-'a']+=1;
            }
            hash[count].push_back(i);
        }
        for(auto& k:hash) res.push_back(k.second);
        return res;
    }
};

详细思路

首先遍历输入的数组,对于其中出现的每个词语,我们都为其建立一个专属的长度为 26 的字符串,用来统计该字符串中每个字母出现的频次。该字符串初始化为全零(共 26 个零),从左到右依次代表字母 a 到 z 出现的频率。

例如 "abc" 对应的字符串为 11100000000000000000000000,同样的 "acb" 对应的字符串其实也是 11100000000000000000000000。为防止混淆,下文称其为'特征码',我们可以利用这特性把字符异位词分类在一起。

具体操作是:遍历数组中的每个字符串,统计其出现各个字母的频率并写出对应的特征码,并将特征码相同的字符串放在一个数组中。创建哈希表 hash 来进行储存,特征码为键,字符串数组对应的为值。

特征码字符串组
11100000000000000000000000"abc" "acb"
10110000000000000000000000"acd" "dca"
......

为了将例如 "acb","abc" 这些字符串以数组的形式合在一起,我们使用 push_back 函数,作用是在动态数组末尾添加新元素,自动扩容。

根据 push_back 的特性,我们最终输出结果仍然采用该函数。

这里有一部分需要注意:

for(auto& k:hash) res.push_back(k.second);

我们使用 k 遍历哈希表的每一个元素(每一个键值对代表一个元素),first 对应的是键,即上文图表中的特征码,second 对应的是值,正是结果需要的,因此我们将每一个元素的 second 连接在一起输出,最终返回 res。

代码逐行解析

vector<vector<string>> res; // 存储最终输出结果的动态数组
unordered_map<string, vector<string>> hash; // 创建哈希表,用来存储特征码和对应的字符串
for(auto& i:strs) // 遍历输入的字符数组
{
    string count(26,0); // 对于其中出现的每个字符串,为其创建特征码并初始化
    for(auto& j:i) // 遍历特征码中的每一个元素
    {
        count[j-'a']+=1; // 如果该元素出现,其对应的索引值的数字加一,例如如果出现'd',其对应的 ascii 码减去'a'对应的 ascii 码为 3(即得到其在字母表中的偏移量),那么对应索引值为 3 的位置加一
    }
    hash[count].push_back(i); // 把特征码(键)相同的字符串放在一个值里
}
for(auto& k:hash) // 遍历哈希表的每个元素
res.push_back(k.second); // 将每个键值对中的值写入 res 数组中
return res; // 返回得到结果

其他小细节

for(auto& i:strs)

auto 是让编译器自动推断 i 的类型,& 代表引用,避免整个拷贝字符串,提高效率。这段代码意思是遍历 strs 的每一个字符串元素,并把当前遍历到的字符赋值给变量 i。

string count(26,0)

创建了一个长度为 26 的字符串,每个位置的初始值均为 0,该字符串命名为 count。

目录

  1. 题目
  2. 完整代码
  3. 详细思路
  4. 代码逐行解析
  5. 其他小细节
  6. for(auto& i:strs)
  7. string count(26,0)

更多推荐文章

查看全部
  • IntelliJ IDEA 集成 GitHub Copilot 使用指南:从安装到实战
  • 从零开始:在 Windows 上安装 Python 3.10
  • Git 基础:认识三大区域与文件修改提交流程
  • 知识库问答机器人:基于 SpringAI+RAG 的实现
  • 前端技术博客创作 Agent 提示词设计与实战
  • AI 本地批量生成漫剧人物三视图实现教程
  • nanobot 通过 webhook 对接钉钉与飞书,实现跨平台消息同步
  • Python 2026 发展展望:AI 时代的核心基础设施语言
  • Llama-Factory使用指南:从入门到实战
  • Open-WebUI 管理员面板深度拆解与配置指南
  • 北航发布 LLaMA-Factory:零代码大模型微调与高效训练框架
  • 执行式 AI 入门:API 调用与网络请求基础
  • AI 写作辅助平台:炼字工坊与蛙蛙写作功能解析
  • 前端加密:常用加密方式及使用指南
  • AXI 总线详解与 FPGA 实现指南
  • JavaScript 基础语法与 jQuery 快速入门
  • Ubuntu 下 llama.cpp 编译与性能调优实战
  • Clawdbot 飞书机器人配置教程
  • 医疗 NLP 实战:电子病历分析与疾病诊断辅助
  • Qwen-Image-2512 V2 模型 ComfyUI 与 WebUI 整合包使用指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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