给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]示例 2:
输入: strs = [""]
输出: [[""]]示例 3:
输入: strs = ["a"]
输出: [["a"]]提示:
1 <= strs.length <= 1040 <= strs[i].length <= 100strs[i]仅包含小写字母
解题思路:排序 + 哈希表
互为字母异位词的单词有一个特点:将它们「排序」之后,两个单词应该是「完全相同」的。所以,我们可以利用这个特性,将单词按照字典序排序,如果排序后的单词相同的话,就划分到同一组中。
这时我们就要处理两个问题:
- 排序后的单词与原单词需要能互相映射;
- 将排序后相同的单词,「划分到同一组」;
利用语言提供的「容器」的强大的功能就能实现这两点:
- 将排序后的字符串(
string)当做哈希表的key值; - 将字母异位词数组(
string[])当成val值。
所以我们定义一个「哈希表」即可解决问题。
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
unordered_map<string, vector<string>> hash;
for(auto& str : strs)
{
// 1. 先进行排序,记得要用一个变量tmp记录未排序前的字符串
string tmp = str;
sort(str.begin(), str.end());
// 2. 将排序后的字符串作为key,然后原始字符串作为value插入到哈希表中
hash[str].push_back(tmp);
}
// 3. 将哈希表中的每组value也就是字符串数组放到结果集中进行返回
vector<vector<string>> ret;
for(auto& e : hash)
ret.push_back(e.second);
return ret;
}
};