P2 - 异位词分组
About 321 wordsAbout 1 min
leetcodehot100
2025-1-9
Quick link to leetcode -> 异位词
题目
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
实现
class Solution {
public:
// 静态哈希函数,用于计算每个字母频次数组的哈希值
static size_t arrayHash(const array<int, 26>& arr) {
size_t hashValue = 0;
hash<int> fn;
for (const auto& i : arr) {
hashValue = (hashValue << 1) ^ fn(i); // 随机哈希
}
return hashValue;
}
vector<vector<string>> groupAnagrams(vector<string>& strs) {
// 使用 unordered_map 来存储以字母频率为键的异位词分组
unordered_map<array<int, 26>, vector<string>, decltype(&Solution::arrayHash)> dict(1000, &Solution::arrayHash);
for (auto& s : strs) {
array<int, 26> counts{}; // 初始化一个大小为 26 的数组来记录字母频率
for (auto& c : s) {
counts[c - 'a']++; // 统计字母频率
}
dict[counts].emplace_back(s); // 将当前单词添加到对应频率数组的分组
}
vector<vector<string>> ans;
for (auto& entry : dict) {
ans.push_back(move(entry.second)); // 将每个异位词分组添加到结果中
}
return ans;
}
};