题目描述
给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。
字母异位词指字母相同,但排列不同的字符串。
示例:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
解题思路
核心思想
字母异位词的特点是:经过排序后,它们会变成相同的字符串。例如:
- “eat” → “aet”
- “tea” → “aet”
- “ate” → “aet”
因此,我们可以将排序后的字符串作为哈希表的键,原始字符串作为值进行分组。
算法步骤
-
创建一个哈希表(Map)来存储分组结果
-
遍历每个字符串:
- 将字符串拆分为字符数组
- 对字符数组进行排序
- 重新组合成字符串作为键
- 将原始字符串存入对应的分组
-
最后返回哈希表的所有值
代码实现
// 提示:
// 1 <= strs.length <= 104
// 0 <= strs[i].length <= 100
// strs[i] 仅包含小写字母
/**
* @param {string[]} strs
* @return {string[][]}
*/
// 先"abc"转成["a", "b", "c"] sort 排序
// 存入map map中有"abc" 存入数组[], 没有新建
var groupAnagrams = function(strs) {
let res = new Map()
for(let item of strs) {
let str = item.split('').sort().join('') //所有相同的都转成“abc"
if(res.has(str)){
res.get(str).push(item)
} else {
res.set(str, [item])
}
}
return [...res.values()]
};
let strs = ["eat","tea","tan","ate","nat","bat"]
groupAnagrams(strs)
复杂度分析
-
时间复杂度:O(n * k * log k),其中 n 是字符串数量,k 是字符串的最大长度。
- 对每个字符串排序需要 O(k log k)
- 遍历 n 个字符串
-
空间复杂度:O(n * k),需要存储所有字符串
关键点解析
- 排序技巧:
split('').sort().join('')是将字符串转换为标准形式的关键步骤 - 哈希表使用:使用 Map 可以方便地存储和检索分组
- 结果转换:
[...res.values()]将 Map 的值转换为数组