news 2026/5/1 9:40:27

哈希2:字母异位符分组

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
哈希2:字母异位符分组

🎯 题目描述

给定一个字符串数组,将所有字母异位词组合在一起。字母异位词指的是由相同字母重排形成的字符串,例如"eat""tea"。可以按任意顺序返回结果列表。

💡 核心思路

要解决这个问题,关键是找到一种统一的标识,让所有字母异位词都对应同一个标识,这样就能用哈希表把它们分组。

我这里提供两种主流思路:

1. 排序法(直观易实现)

  • 核心逻辑:将每个字符串排序,排序后的结果相同的字符串就是字母异位词。例如"eat""tea"排序后都是"aet"
  • 时间复杂度:\(O(nk\log k)\),其中 n 是字符串数量,k 是单个字符串的最大长度。排序每个字符串需要 \(O(k\log k)\),共 n 个字符串。
  • 空间复杂度:\(O(nk)\),用于存储哈希表和结果。

2. 字符计数法(更优时间复杂度)

  • 核心逻辑:统计每个字符串中 26 个字母的出现次数,用一个包含计数的字符串作为哈希表的键。例如"eat"的计数是a:1, e:1, t:1,可以表示为"1#0#0#...#1#1"
  • 时间复杂度:\(O(nk)\),统计每个字符串的字符计数只需 \(O(k)\),共 n 个字符串。
  • 空间复杂度:\(O(nk)\),用于存储哈希表和结果。

🚀 完整代码实现

排序法(AC 代码)

cpp

#include <vector> #include <string> #include <unordered_map> #include <algorithm> using namespace std; class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { // 哈希表:键为排序后的字符串,值为对应的字母异位词列表 unordered_map<string, vector<string>> groups; for (string& s : strs) { string sorted_s = s; // 排序字符串,得到统一标识 sort(sorted_s.begin(), sorted_s.end()); // 将原字符串加入对应分组 groups[sorted_s].push_back(s); } // 将哈希表中的值转移到结果中 vector<vector<string>> result; result.reserve(groups.size()); // 预分配空间,提升效率 for (auto& [_, group] : groups) { result.push_back(move(group)); // 使用move避免拷贝 } return result; } };

字符计数法(更优时间复杂度)

cpp

#include <vector> #include <string> #include <unordered_map> using namespace std; class Solution { public: vector<vector<string>> groupAnagrams(vector<string>& strs) { unordered_map<string, vector<string>> groups; for (string& s : strs) { // 统计26个字母的出现次数 vector<int> count(26, 0); for (char c : s) { count[c - 'a']++; } // 将计数转换为字符串作为键 string key; for (int i = 0; i < 26; ++i) { key += to_string(count[i]) + '#'; } groups[key].push_back(s); } vector<vector<string>> result; for (auto& [_, group] : groups) { result.push_back(move(group)); } return result; } };

📝 关键细节解析

  1. 结构化绑定auto& [_, group]这是 C++17 引入的语法,用于遍历哈希表时直接提取键值对。_作为占位符表示我们不需要使用键,group直接引用值(字母异位词列表),避免了拷贝,提升了效率。

  2. reserve预分配空间在创建结果vector时,调用reserve(groups.size())可以提前分配足够的内存,避免后续push_back时频繁扩容,从而提升性能。

  3. std::move避免拷贝在将哈希表中的vector转移到结果时,使用std::move可以将vector的所有权直接转移,而不是进行昂贵的深拷贝。


🧪 测试用例验证

以题目示例输入strs = ["eat","tea","tan","ate","nat","bat"]为例:

  • 排序法中,"eat""tea""ate"排序后均为"aet",会被分到同一组。
  • 字符计数法中,它们的字符计数完全相同,也会被分到同一组。最终输出:[["bat"],["nat","tan"],["ate","eat","tea"]],与题目要求一致。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 7:39:34

【大数据毕设源码分享】基于springboot+Hadoop平台的岗位推荐系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/18 19:02:46

【大数据毕设源码分享】基于springboot的大型超市数据处理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/26 1:43:33

springboot175基于springboot商场停车场预约服务管理信息系统

目录具体实现截图摘要系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 摘要 该系统基于SpringBoot框架开发&#xff0c;旨在为商场停车场提供高效、智能的预约服务与管理功能。通过整合现代信息技…

作者头像 李华
网站建设 2026/4/26 11:25:51

C_G18030.DLL文件丢失找不到问题 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/5/1 9:40:06

IT内卷时代,普通Java程序员面试前如何查漏补缺?

现在互联网大环境不好&#xff0c;互联网公司纷纷裁员并缩减HC&#xff0c;更多程序员去竞争更少的就业岗位&#xff0c;整的IT行业越来越卷。身为Java程序员的我们就更不用说了&#xff0c;上班8小时需要做好本职工作&#xff0c;下班后还要不断提升技能、技术栈&#xff0c;才…

作者头像 李华