news 2026/6/5 8:30:51

哈希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/6/5 5:41:48

搭建MCP Server Node.js环境总出错?这6大核心组件你配对了吗?

第一章&#xff1a;MCP Server Node.js版开发环境搭建概述 搭建 MCP Server 的 Node.js 开发环境是实现服务端通信逻辑与业务处理的基础步骤。一个稳定且高效的开发环境能够显著提升开发效率&#xff0c;降低调试成本。本章将介绍核心依赖的安装、项目初始化配置以及运行调试的…

作者头像 李华
网站建设 2026/5/31 16:56:56

GPEN模型剪枝尝试:减小体积不影响画质的探索案例

GPEN模型剪枝尝试&#xff1a;减小体积不影响画质的探索案例 你有没有遇到过这样的问题&#xff1a;一个效果惊艳的人像修复模型&#xff0c;推理速度不错&#xff0c;但模型文件太大&#xff0c;部署到边缘设备或线上服务时内存吃紧&#xff1f;尤其是像GPEN这样基于GAN结构的…

作者头像 李华
网站建设 2026/5/20 16:20:05

dify+企业微信机器人组合使用秘籍:提升团队效率的稀缺方案首次公开

第一章&#xff1a;dify企业微信机器人组合使用的核心价值 将 Dify 与企业微信机器人结合&#xff0c;能够显著提升企业内部的信息自动化处理能力与智能交互水平。通过该组合&#xff0c;企业可以构建基于自然语言的智能助手&#xff0c;实现任务提醒、数据查询、流程审批等高频…

作者头像 李华
网站建设 2026/5/20 11:48:44

Emotion2Vec+ Large直播平台实时监控:主播情绪状态可视化看板

Emotion2Vec Large直播平台实时监控&#xff1a;主播情绪状态可视化看板 1. 引言&#xff1a;为什么我们需要主播情绪监控&#xff1f; 你有没有想过&#xff0c;一个主播在直播时的情绪变化&#xff0c;其实藏着巨大的商业价值&#xff1f;比如&#xff0c;当观众刷出一条争…

作者头像 李华
网站建设 2026/6/1 20:14:08

【踩坑】Nginx 413 Request Entity Too Large

我们在做上传视频或者大图片的时候&#xff0c;有时候会报413 Request Entity Too Large的错误&#xff0c;原因是nginx做了上传文件大小的限制&#xff0c;你需要加上一句配置代码。打开nginx/conf/nginx.conf&#xff0c;加入下面这行代码&#xff1a;http {client_max_body_…

作者头像 李华
网站建设 2026/5/20 12:11:23

Qwen3-Embedding-0.6B实战教程:基于sglang的高效率文本向量生成

Qwen3-Embedding-0.6B实战教程&#xff1a;基于sglang的高效率文本向量生成 1. Qwen3-Embedding-0.6B 模型简介 你有没有遇到过这样的问题&#xff1a;想从成千上万篇文章中快速找到最相关的几篇&#xff0c;或者需要把用户输入的问题精准匹配到知识库里的答案&#xff1f;传…

作者头像 李华