给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 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]
仅包含小写字母
解题思路:
- 首先定义了一个自定义排序函数
mySort
,它将输入的字符串按字母顺序进行排序,并返回排序后的字符串。 - 然后定义了一个自定义哈希函数
myHash
,它使用给定的哈希种子值和字符串中的字符来计算哈希值。 - 在
groupAnagrams
函数中,创建了一个无序哈希映射map
,用于存储按字母组成相同的字符串的分组结果。 - 遍历输入的字符串数组
strs
,对每个字符串进行排序得到sorted_str
,然后计算它的哈希值hash_key
。 - 将当前字符串
str
插入到哈希桶hash_key
对应的向量中。 - 最后,遍历哈希映射
map
,将每个哈希桶中的字符串列表添加到结果向量res
中,并返回最终的结果。
class Solution {
public:
std::string mySort(const std::string& a) {
std::string b = a;
std::sort(b.begin(), b.end());
return b;
}
// 自定义哈希函数
unsigned int myHash(const std::string& str) {
const unsigned int seed = 131; // 更大的质数
unsigned int hash = 0;
for (char ch : str) {
hash = hash * seed + ch;
}
return hash;
}
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> res;
std::unordered_map<unsigned int, std::vector<std::string>> map;
for (const auto& str : strs) {
auto sorted_str = mySort(str);
unsigned int hash_key = myHash(sorted_str);
map[hash_key].emplace_back(str);
}
for (const auto& item : map) {
res.emplace_back(item.second);
}
return res;
}
};
发表回复