49. 字母异位词分组

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

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母都恰好只用一次。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

提示:

  • 1 <= strs.length <= 10^4
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/group-anagrams
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

一解

使用 Hash 表进行统计,设 Hash 表的 key 为数组,该数组大小为 26 ,记录了对应位置的字母出现次数。Hash 表的 value 为字符串数组。比如strs = ["eat", "tea"] ,其 Hash 表结构如下:

Hash[(1, 0, 0, 0, 1, 0, 0, 0...)] = ['eat', 'tea']

eat 中的字母 a ,在所有字母中排行第 1,处于数组的 0 号位。eat 中的字母 e ,在所有字母中排行第 5(abcde),处于数组的 4 号位。

此外,题解使用了 collections.defaultdict 。

该方法生成字典,具有默认值,比如:

a = collections.defaultdict(list)
# 具有默认值:「空列表」
a[20]
[]

如果参数是 int ,默认值是 0:

a = collections.defaultdict(int)
# 具有默认值:「0」
a[20]
0
class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        dic = collections.defaultdict(list)
        for s in strs:
            count = [0]*26
            for c in s:
                count[ord(c) - ord('a')] += 1
						# 字典的 key 只能使用 tuple
            dic[tuple(count)].append(s)
				# 返回所有 value
        return list(dic.values())
  • 时间复杂度 O(nk):n 为 strs 长度,k 为 str 的最长长度。
  • 空间复杂度 O(nk):n 为 strs 长度,k 为 str 的最长长度。