一、题目
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i]
仅包含小写字母
二、思路
我们需要统计出字母异位词,其实就是统计出每一个字符串中出现的字母以及字母出现的次数,然后把相同的放在一起。那么我们可以采用哈希表的方式来解决这个问题,原因是我上一篇文章里提到过的,哈希表就像一个字典,当你想找其中储存的某一个字时,你可以一下找到,不需要遍历这本字典里的每一个字。我们可以利用哈希表来解决这个字母异位词分组的问题,对所有字母创造一个索引,a对应索引位置0,b对应索引位置1,z对应索引位置25,
a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
而字母在字符串中出现几次就记做几,比如eat就可以用哈希表表示为如下,空格地方为0:
a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
1 | 1 | 1 |
tea的哈希表表示为:
a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z |
1 | 1 | 1 |
他们的表示方式相同,所以他俩是一组字母异位词。
具体的代码实现如下:
class Solution {
public:
// 使用unordered_map来存储字符串的计数特征与其对应的字符串列表(即具有相同字符计数但排列不同的字符串)
unordered_map<string, vector<string>> mm;
// 函数用于将给定的字符串数组中的字符串按照是否为字母异位词进行分组
vector<vector<string>> groupAnagrams(vector<string>& strs) {
// 遍历输入的字符串数组
for (const auto& e : strs) {
// 创建一个长度为26的字符串v,用于存储每个小写字母的出现次数(初始化为'0')
string v(26, '0');
// 遍历当前字符串e的每个字符
for (const auto& ee : e) {
// 计算字符ee相对于'a'的偏移量,得到其在v中的索引
int idx = ee - 'a';
// 在v的对应位置上的字符(实际上是数字表示的出现次数)增加1
v[idx]++;
}
// 将当前字符串e添加到以其计数特征v为键的vector中
mm[v].push_back(e);
}
// 创建一个vector来存储最终的分组结果
vector<vector<string>> ans;
// 遍历unordered_map mm,将每个value(即具有相同计数特征的字符串列表)添加到ans中
for (auto& e: mm) {
ans.push_back(e.second);
}
// 返回分组后的结果
return ans;
}
};