
✨ 把代码写进星轨,用逻辑丈量宇宙。
| 导航 | 链接 |
|---|---|
| 个人主页 | 🏠 星轨初途 |
| 基础语言专栏 | 💻 C语言、📚 数据结构 |
| 刷题实战专栏 | 🚀 算法及编程题分享、📝 力扣每日刷题分享 |
文章目录

题目思路
字母异位词虽然字符顺序不同,但将字符串排序后,结果一定相同。
例如:
text
"eat" -> "aet"
"tea" -> "aet"
"ate" -> "aet"
因此,可以将排序后的字符串作为分组依据。
方法一:排序 + 哈希表
使用排序后的字符串作为哈希表的 key,原字符串保存到对应的 vector 中。
例如:
text
"aet" -> ["eat", "tea", "ate"]
"ant" -> ["tan", "nat"]
"abt" -> ["bat"]
复杂度分析
设字符串数量为 N,每个字符串平均长度为 K。
- 时间复杂度:
O(N × KlogK); - 空间复杂度:
O(N × K)。
代码实现
cpp
class Solution
{
public:
vector<vector<string>> groupAnagrams(vector<string>& strs)
{
unordered_map<string, vector<string>> mp;
for (string s : strs)
{
string key = s;
sort(key.begin(), key.end());
mp[key].push_back(s);
}
vector<vector<string>> ans;
for (auto& p : mp)
{
ans.push_back(p.second);
}
return ans;
}
};
方法二:排序 + 连续分组
将排序后的字符串和原字符串绑定在一起:
text
pair<排序后的字符串, 原字符串>
然后对所有 pair 进行排序。
排序后,相同 key 的元素会连续排列,再依次完成分组。
复杂度分析
- 字符串内部排序:
O(N × KlogK); - 整体排序:
O(NlogN × K); - 空间复杂度:
O(N × K)。
代码实现
cpp
class Solution
{
public:
vector<vector<string>> groupAnagrams(vector<string>& strs)
{
vector<pair<string, string>> temp;
for (const string& s : strs)
{
string key = s;
sort(key.begin(), key.end());
temp.push_back({key, s});
}
sort(temp.begin(), temp.end());
vector<vector<string>> ans;
for (int i = 0; i < temp.size();)
{
int j = i;
vector<string> group;
while (j < temp.size() && temp[j].first == temp[i].first)
{
group.push_back(temp[j].second);
++j;
}
ans.push_back(group);
i = j;
}
return ans;
}
};
总结
| 方法 | 核心思路 | 时间复杂度 | 空间复杂度 |
|---|---|---|---|
| 排序 + 哈希表 | 排序结果作为 key,使用哈希表分组 |
O(N × KlogK) |
O(N × K) |
| 排序 + 连续分组 | 保存 {key, 原字符串},整体排序后分组 |
O(NK(logK + logN)) |
O(N × K) |
两种方法都利用了:字母异位词排序后结果相同
但哈希表方法代码更加简洁,也是这道题最常用的解法;整体排序方法则不需要使用哈希表。