49. 字母异位词分组
题目地址(49. 字母异位词分组)
https://leetcode-cn.com/problems/group-anagrams/
题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i] 仅包含小写字母
前置知识
- hashmap
代码
- 语言支持:Python
Python Code:
class Solution(object):
def groupAnagrams(self, strs):
"""
:type strs: List[str]
:rtype: List[List[str]]
"""
# str_dict = {} # 不可以
str_dict = collections.defaultdict(list)
for s in strs:
s_key = [0] * 26
for c in s:
s_key[ord(c) - ord('a')] += 1
str_dict[tuple(s_key)].append(s) # key对应对个值
return str_dict.values()
# 更好的编码方案是利用每个字符的出现次数进行编码
# 我们建立一个 26 长度的 counts 数组(如果区分大小写,我们可以建立 52 个,如果支持其他字符依次类推)。
# 然后我们给每一个字符一个固定的数组下标,然后我们只需要更新每个字符出现的次数。
# 最后形成的 counts 数组如果一致,则说明他们可以通过 交换顺序得到。
# 算法空间复杂度 O(n), 时间复杂度 O(n * k), n 为数组长度,k 为字符串的平均长度
# https://github.com/azl397985856/leetcode/blob/master/problems/49.group-anagrams.md
# """
# 思路同上,在Python中,这里涉及到3个知识点:
# 1. 使用内置的 defaultdict 字典设置默认值;
# 2. 内置的 ord 函数,计算ASCII值(等于chr)或Unicode值(等于unichr);
# 3. 列表不可哈希,不能作为字典的键,因此这里转为元组;
# """
复杂度分析