news 2026/9/22 19:25:51

21 . 字母异位词分组

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
21 . 字母异位词分组

题目介绍

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i]仅包含小写字母
class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { } };

全文核心1400字,阅读+思考8min

原题链接:49. 字母异位词分组 - 力扣(LeetCode)


解析

1 . 本题需求很明确:给你一个字符串数组。对于其中相同字母(排列组合)组合成的字符串归为一组。

2 . 很自然的,结果要求返回一个二维数组。不难想,其元素则是,一组一组“字母异位词”

3 . 初拿到此题,不由想:难道我们要通过递归每个字符串,去得出每个字符串的各种排列组合……

4 . 再去统计哪些组合出现,再整合

5 . 未免想复杂了,这只是个分类工作

哈希

1 . 你可能会好奇,怎么就突然用上——“哈希”?请听接下来的分析

2 . 首先清楚此处的核心需求,材料都已经给你(vector<string>& strs)

3 . 我们需要做的,只是将它们分类,按照一定标准,把几个字符串分为一个数组。最后许多个数组合成一个大的数组

4 . 返回这个二维数组

5 . 而这个“一定标准”是什么呢?比如"nat"和"tan"凭什么分为一组,而“ate”、"eat"和"tea"凭什么分为一组

不难发现,它们都有相同的字母组成,一个不多一个不少——只是顺序不同

6 . 而让看起来顺序不一样的字母串归在一类,首先让它们展示出共性

for(auto & e : strs) { string key = e; sort(key.begin(),key.end()); // 对key原地排序,"nat"和"tan",必然展示出共性—— "ant" }

7 . 既然有了分类标准,就应该开始分类

8 . 本题要求返回一个二维数组——“万丈高楼平地起”,必然先得把一维数组准备好

9 . 不如,让key作为一个指标,它对应映射一组由key排列组合的单词

10 . 结构:unordered_map<string,vector<string>>

class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { std::unordered_map<string,vector<string>> mp; for(auto & e: strs) { string key = e; sort(key.begin(),key.end()); mp[key].push_back(e);// 展现出共性后,把当前的e往key组塞 } } };

注:

字符串少拷贝,使用for(auto & e: strs)

11 . 现在mp已经有许多组 <key , vector<string>>

12 . 还记得要求返回二维数组吗?那么不难想到,最终结果集就是mp里的vector<string>组合起来成为的二维数组

13 . 那还等什么,遍历mp,把每一组的vector<string>作为元素放进ret数组里

vector<vector<string>> vv; for(auto & it:mp) // 这里的it 为 pair<string,vector<string>> { vv.push_back(it.second); }

完整代码:

class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { // 分类 std::unordered_map<string,vector<string>> mp; for(auto & e: strs) { string key = e; sort(key.begin(),key.end()); mp[key].push_back(e); } // 整合 vector<vector<string>> vv; for(auto & it:mp) { vv.push_back(it.second); } return vv; } };

总结以及完整参考代码

class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { // 分类 std::unordered_map<string,vector<string>> mp; for(auto & e: strs) { string key = e; sort(key.begin(),key.end()); mp[key].push_back(e); } // 整合 vector<vector<string>> vv; for(auto & it:mp) { vv.push_back(it.second); } return vv; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/23 10:08:08

Drawnix白板工具:用代码思维重塑图形设计工作流

Drawnix白板工具&#xff1a;用代码思维重塑图形设计工作流 【免费下载链接】drawnix 开源白板工具&#xff08;SaaS&#xff09;&#xff0c;一体化白板&#xff0c;包含思维导图、流程图、自由画等。All in one open-source whiteboard tool with mind, flowchart, freehand …

作者头像 李华
网站建设 2026/9/21 15:29:16

Monaco Editor代码提示响应优化实战指南

Monaco Editor代码提示响应优化实战指南 【免费下载链接】monaco-editor A browser based code editor 项目地址: https://gitcode.com/gh_mirrors/mo/monaco-editor 作为一名前端开发者&#xff0c;你是否曾在编码过程中遇到过这样的困扰&#xff1a;按下.键后&#xf…

作者头像 李华
网站建设 2026/9/21 11:20:10

下一代前端开发:用Next.js与大模型AI,零代码解锁你的智能助手

项目概述 Vercel AI-Chatbot 是一个基于 Next.js 16 构建的、功能丰富的全栈现代化 Web 应用。其核心特点是深度集成 AI 功能&#xff0c;并具备实时协作、数据管理和代码编辑等复杂能力。 演示视频 下面是一个 Vercel AI-Chatbot 项目的演示视频&#xff0c;展示了应用的主…

作者头像 李华
网站建设 2026/9/21 23:55:06

跨越浏览器壁垒:Skyvern如何实现自动化脚本的通用兼容性

跨越浏览器壁垒&#xff1a;Skyvern如何实现自动化脚本的通用兼容性 【免费下载链接】skyvern 项目地址: https://gitcode.com/GitHub_Trending/sk/skyvern 在企业级自动化实践中&#xff0c;我们常常面临这样的困境&#xff1a;精心设计的自动化流程在Chrome浏览器上运…

作者头像 李华
网站建设 2026/9/22 1:38:43

应用现代化 | 金融智能风控的新标尺——《金融级智能应用能力要求 风控场景》标准正式发布

2025年12月12日,由中国通信标准化协会主办、中国信息通信研究院(以下简称“中国信通院”)承办的“2025AI云产业发展大会——AI云推理与交互分论坛”在北京成功举办。会上,中国信通院正式发布了《金融级智能应用能力要求 风控场景》标准,并同步启动了《金融级智能应用实践指…

作者头像 李华
网站建设 2026/9/23 2:33:42

Undetectable接入亮数据代理ip做自媒体矩阵

Undetectable接入亮数据代理ip做自媒体矩阵亮数据官网https://www.bright.cn/integration/undetectable/?utm_sourcebrand&utm_campaignbrnd-mkt_cn_csdn_thjs202512&promobright30 亮数据公众号https://bbs.csdn.net/topics/620074200

作者头像 李华