给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母都恰好只用一次。
示例 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 的最长长度。