🔗 字母异位词分组
📌 题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是指字母相同但排列不同的字符串。例如
"eat"
和"tea"
就是字母异位词。
✅ 示例解析
示例 1:
- 输入:
strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
- 输出:
[["bat"],["nat","tan"],["ate","eat","tea"]]
- 解释:
"bat"
没有其他字母异位词。"nat"
与"tan"
互为字母异位词。"ate"
、"eat"
、"tea"
三者互为字母异位词。
示例 2:
- 输入:
strs = [""]
- 输出:
[[""]]
- 说明:空字符串与自身构成一组。
示例 3:
- 输入:
strs = ["a"]
- 输出:
[["a"]]
- 说明:单个字符,只有一组。
⚠️ 提示
1 <= strs.length <= 10⁴
0 <= strs[i].length <= 100
strs[i]
仅包含小写字母
💡 解法:哈希表 + 排序
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<>();
for (String s : strs) {
char[] charArray = s.toCharArray();
Arrays.sort(charArray);
String sorted = new String(charArray);
map.computeIfAbsent(sorted, k -> new ArrayList<>()).add(s);
}
return new ArrayList<>(map.values());
}
}
📊 复杂度分析
- 时间复杂度:O(N × K log K)
- N 是字符串个数,K 是字符串平均长度
- 每个字符串排序耗时 O(K log K)
- 空间复杂度:O(N × K)
- 哈希表存储所有字符串分组
🧩 解题思路
- 核心思想:字母相同的字符串,排序后结果相同 → 可作为哈希表的
key
。 - 遍历每个字符串:
- 转为字符数组并排序
- 以排序后的字符串为
key
,原字符串加入对应的List
- 使用
computeIfAbsent
简化空值判断 - 最终返回
map.values()
的集合