49. 字母异位词分组
题目
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i]
仅包含小写字母
示例
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
题解
以题目中所给出的 [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]] 结果样例,不难发现,当我们对其中的每一个字符串,都按照字典序进行排序后,原式就会变为 [[“abt”],[“ant”,“ant”],[“aet”,“aet”,“aet”]] ,由此我们可以归纳出「若两个单词互相为字母异位词,那么他们按照字典序进行排序后,所得结果一定相同」。
因为对于一组字母异位词,每一个按字典序排序后都能得到相同的结果。因此,就可以以这个排序后的结果为 Key ,原字母异位词的一组为 Value,就比如 aet→[ate,eat,tea] 。
具体来说,我们可以建立一个「由一个字符串映射到一个字符串数组」的哈希表Map<String,List> 。我们从左至右遍历 strs ,对于当前的 strs[i] ,我们将其进行排序得到 SortedStr ,随后将 strs[i] 添加到 hash[SortedStr] 所映射到的 List 上即可。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string,vector<string>> hashmap;
for(auto & str : strs){
string sortedStr = str;
sort(sortedStr.begin(), sortedStr.end());
hashmap[sortedStr].emplace_back(str);
}
vector<vector<string>> result;
for(auto & pair : hashmap){
result.emplace_back(pair.second);
}
return result;
}
};
C++相关语法: <veector>
头文件中的emplace_back
函数
emplace_back
是 C++ 标准库中 vector
容器的一个成员函数,用于在 vector
的末尾就地构造并添加一个新元素。这个函数的特点是它可以直接在容器的内存空间内构造元素,避免了额外的复制或移动操作,因此效率更高。
在我的代码中,hashmap
是一个 unordered_map
,其定义如下:
unordered_map<string, vector<string>> hashmap;
这意味着 hashmap
的键(key)是 string
类型,值(value)是 vector<string>
类型。
当使用 hashmap[sortedStr]
时,你正在访问 hashmap
中与 sortedStr
键关联的值,这个值就是 vector<string>
类型。