Leetcode热题100—— 49. 字母异位词分组

25 阅读2分钟

题目描述

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

 

示例 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中,循环遍历下来,相同keystr就分组到一块了

时间、空间复杂度

时间复杂度: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)。