题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
解释:
- 在 strs 中没有字符串可以通过重新排列来形成
"bat"。 - 字符串
"nat"和"tan"是字母异位词,因为它们可以重新排列以形成彼此。 - 字符串
"ate","eat"和"tea"是字母异位词,因为它们可以重新排列以形成彼此。
题解 (JavaScript)
Map
/**
* @param {string[]} strs
* @return {string[][]}
*/
var groupAnagrams = function (strs) {
const map = new Map();
for (const str of strs) {
const key = str.split('').sort().join('');
if (map.has(key)) {
map.get(key).push(str);
} else {
map.set(key, [str])
}
}
return Array.from(map.values());
};
两个字符串互为字母异位词也就是说:它们包含的字符种类和字符数量完全相同,只是顺序不同。
那么我们通过让所有互为异位词的字符串都映射到同一个、唯一的标识符(Key) 来实现分组 。
通过sort方法对字符串中分隔出的字母进行排序再组合为新的字符串key,然后存储到map中,循环遍历下来,相同key的str就分组到一块了
时间、空间复杂度
时间复杂度:O(N⋅LlogL)
- N:输入字符串数组的长度 (
strs.length)。 - L:字符串的平均长度。
算法瓶颈在于排序。我们对 N 个字符串,每个字符串长度约为 L 进行了排序。字符串排序的时间复杂度是 O(LlogL)。
因此,总时间复杂度为 N×O(LlogL)=O(N⋅LlogL)。
空间复杂度:O(N⋅L)
- 我们使用了一个 Map 来存储所有原始字符串。
- 在最坏情况下(所有字符串都互不相同),Map 中会存储 N 个 Key,且 Value 中存储了所有原始字符串。
- 总存储空间与所有输入字符串的总长度成正比,因此空间复杂度为 O(N⋅L)。