【LeetCode力扣热题100】【LeetCode 49】字母异位词分组

ops/2024/12/14 19:02:28/

方法一:字符串排序

字母异位词指的是两个单词的字符组成相同,字符的排列顺序不同,由此可推断,这两个词经过内部字符排序后的结果是相同的,[nat -> ant] [tan -> ant]。将排序后的词语作为map的key值,map的value存储排序后结果相同的单词。

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {vector<vector<string>> res;unordered_map<string, vector<string>> stringmap;for(auto _str : strs){string tmp = _str;sort(tmp.begin(), tmp.end());stringmap[tmp].emplace_back(_str);}for(auto _map : stringmap){res.emplace_back(_map.second);}return res;}
};

方法二:字符计数

每个单词的字符组成相同顺序不同,那么组成单词的字母种类和数量是相同的,可以将字母和数字作为map的key值,字符种类和数量相同的单词存储到map的value中。

下面是官方代码:

class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {// 自定义对 array<int, 26> 类型的哈希函数auto arrayHash = [fn = hash<int>{}] (const array<int, 26>& arr) -> size_t {return accumulate(arr.begin(), arr.end(), 0u, [&](size_t acc, int num) {return (acc << 1) ^ fn(num);});};unordered_map<array<int, 26>, vector<string>, decltype(arrayHash)> mp(0, arrayHash);for (string& str: strs) {array<int, 26> counts{};int length = str.length();for (int i = 0; i < length; ++i) {counts[str[i] - 'a'] ++;}mp[counts].emplace_back(str);}vector<vector<string>> ans;for (auto it = mp.begin(); it != mp.end(); ++it) {ans.emplace_back(it->second);}return ans;}
};作者:力扣官方题解
链接:https://leetcode.cn/problems/group-anagrams/solutions/520469/zi-mu-yi-wei-ci-fen-zu-by-leetcode-solut-gyoc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

【代码解释】:

auto arrayHash = [fn = hash<int>{}] (const array<int, 26>& arr) -> size_t {return accumulate(arr.begin(), arr.end(), 0u, [&](size_t acc, int num) {return (acc << 1) ^ fn(num);});};

上述部分的代码是定义array<int, 26>类型数组的哈希值,用两个嵌套的lambda表达式实现。第一个lambda表达式创建了一个hash<int>类型的变量fn用于在表达式内部调用,声明了参数const array<int, 26>& arr,返回值类型是size_t,函数体实现的功能是累加数组内部单个元素的哈希值。第二个lambda表达式实现的是对数组中单个元素进行哈希值的计算,用acc<<1^fn(num)的方式减少冲突。

unordered_map<array<int, 26>, vector<string>, decltype(arrayHash)> mp(0, arrayHash);

上述代码定义了unordered_map的变量。定义arrayHash的目的是为了让unordered_map接受array<int, 26>作为键值。默认情况下,std::unordered_map 的键需要支持 std::hash,但 std::hash 并未针对 std::array 这种容器类型提供默认实现。因此,自定义哈希函数是为了使 unordered_map 能够处理 std::array<int, 26> 类型的键。


http://www.ppmy.cn/ops/141884.html

相关文章

Redis学习笔记之——学习计划

Redis——Remote Dictionary Server&#xff0c;开源、基于内存、速度快、key-value... Redis做为一个高性能的键值存储系统&#xff0c;广泛应用于缓存、会话存储、分布式锁以及其他需要快速访问的数据场景中。熟悉掌握redis&#xff0c;似乎已成为广大码农们必备的一项技能。…

智汇云舟4个案例入选“中国联通智慧城市物联感知与AI应用案例”

12月10日&#xff0c;由中国联通智慧城市军团联合联通数字科技有限公司物联网事业部、物联中国团体组织联席会共同主办的“中国联通首届智慧城市领域物联感知与AI应用优秀案例发布交流大会”在郑州举行。大会现场对50余个优秀案例进行了集中发布与表彰。智汇云舟凭借深厚的技术…

短视频矩阵源码开发部署全流程解析

在当今的数字化时代&#xff0c;短视频已成为人们娱乐、学习和社交的重要方式。短视频矩阵系统的开发与部署&#xff0c;对于希望在这一领域脱颖而出的企业和个人而言&#xff0c;至关重要。本文将详细阐述短视频矩阵源码的开发与部署流程&#xff0c;并附上部分源代码示例&…

计算机毕业设计Python中华古诗词知识图谱可视化 古诗词智能问答系统 古诗词数据分析 古诗词情感分析模型 自然语言处理NLP 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

用友U8+ API接口使用教程

前言 U8和其他的公开的开放API接口有一些差异&#xff0c;他是需要先对接的到代理服务器&#xff0c;通过代理服务器进行对接&#xff0c;所以只要保证U8能上网就能对接&#xff0c;和畅捷通T的模式有点类似 流程&#xff1a; 注册成为开发者&#xff08;用于创建用友U8 API应…

React 18

文章目录 React 18自动批处理并发特性Suspense 组件增强新 HookscreateRoot API 替代 ReactDOM.renderStrict Mode严格模式服务器端渲染改进性能优化 React 18 React 18 引入了一系列新特性和改进&#xff0c;旨在提升性能、改善用户体验&#xff0c;并简化开发流程。以下是 R…

同城到家预约上门服务解决方案:家政预约同城服务小程序

### 系统架构"同城到家预约上门服务解决方案&#xff1a;PHP家政预约同城服务小程序"采用B/S架构&#xff0c;后端使用PHP语言开发&#xff0c;前端则基于微信小程序平台。系统分为用户端、服务端和后台管理端&#xff0c;各端相互依赖又相互独立&#xff0c;支持多种…

国产自主可控新征程:华为原生鸿蒙系统与鲲鹏认证

华为于今年10月22日在深圳正式发布了其原生鸿蒙系统HarmonyOS NEXT。这是我国首个实现全栈自研的操作系统&#xff0c;标志着中国在操作系统领域取得了突破性进展。HarmonyOS NEXT 5.0的发布&#xff0c;使得鸿蒙操作系统成为继苹果iOS和安卓系统之后的全球第三大移动操作系统&…