题意理解
🧠 什么是“字母异位词”?
字母异位词是指由相同的字母组成,只是排列顺序不同的单词。
比如
:
"eat" 和 "tea" 是异位词,它们都包含 'e'、'a' 和 't'。
"ate" 也是它们的异位词。
但是 "tan" 就不是,它包含 't'、'a'、'n',和上面三个字母不同。
✅ 方法一:排序作为哈希表 key
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs)
{
unordered_map<string, vector<string>> mp;
for (const string& str : strs)
{
string key = str;
sort(key.begin(), key.end()); // 将字符串排序,作为哈希表 key
mp[key].push_back(str); // 将原字符串加入对应分组
}
vector<vector<string>> res;
for (const auto& [key, group] : mp)
{
res.push_back(group); // 提取所有 value 即为分组结果
}
return res;
}
};
🔍 时间复杂度
- 排序每个字符串 O(k log k),总共 n 个字符串 ⇒ O(nk log k)
💾 空间复杂度
- 需要额外存储 HashMap 和结果集 ⇒ O(nk)
✅ 方法二:计数字符频率作为 key
class Solution
{
public:
vector<vector<string>> groupAnagrams(vector<string>& strs)
{
unordered_map<string, vector<string>> mp;
for (string& str : strs)
{
vector<int> count(26, 0);
for (char ch : str)
{
count[ch - 'a']++;
}
// 手动编码计数数组,例如 "aabbc" → "a2b2c1"
string key;
for (int i = 0; i < 26; ++i)
{
if (count[i] > 0)
{
key += (char)('a' + i);
key += to_string(count[i]);
}
}
mp[key].push_back(str);
}
vector<vector<string>> res;
for (auto& [key, group] : mp)
{
res.push_back(group);
}
return res;
}
};
🔍 时间复杂度
- 每个字符串统计字母频率 O(k),总共 n 个 ⇒ O(nk)
💾 空间复杂度
- 存储每个字符串、HashMap 以及编码 key ⇒ O(nk)