题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 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]
仅包含小写字母
函数签名:
def groupAnagrams(self, strs):
思路/题解
字母异位词的共同点:编码相同
什么意思?看下面这张图就理解了
- 用一个长度为 26 的整型数组来辅助每个单词的编码,数组中的每个索引代表 a~z 中的一个字母,值代表该字母在单词中出现的频次(异位词的数组都长成一个样子)
- 数组转换成的字符串,比如上图中的
"1000100..00100..."
就是单词 "ate"、"eat"、"tea" 的编码 - 在遍历过程中用哈希表来记录出现的编码对应的字母 【key : 编码 value : 字符串数组中编码成 key 的单词列表】
e.g. hmap = {"1000100..00100..." : ["ate", "eat", "tea"] }
具体代码
class Solution(object):
def groupAnagrams(self, strs):
"""
:type strs: List[str]
:rtype: List[List[str]]
"""
n = len(strs)
hmap = {}
res = []
for i in range(n):
m = len(strs[i])
tmp = [0] * 26
for j in range(m):
tmp[ord(strs[i][j])-97] += 1
wordEncoding = str(tmp)
if wordEncoding not in hmap:
hmap[wordEncoding] = [strs[i]]
else:
hmap[wordEncoding].append(strs[i])
for v in hmap.values():
res.append(v)
return res