给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
说明:
- 所有输入均为小写字母。
- 不考虑答案输出的顺序。
解题思路
Leetcode 242:有效的字母异位词(最详细解决方案!!!)
Leetcode 438:找到字符串中所有字母异位词(最详细解决方案!!!)
基于上面两篇,我们对于异位词问题已经有了一定的认识了,所谓的异位词不过是,单词对应的不同字母的个数都一样。
所以我们可以将输入列表strs中的字符串通过collections.Counter
统计字符出现的个数,接着将相同的counter
放到一个列表中即可,但是这里不合适因为counter
不能作为key
,因为是不可hash
的对象。所以这种方式好像不可行,我们还有没有办法判断异位词呢?我们可以将所有的str
排序后比较。那么我们可以将排序好的str
作为key
,那么value
是什么呢?value
应该是result
列表中str
对应列表的位置。例如
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
result
例表中ate
对应的位置应该是和eta
和tea
相同,都是0
。于是我们就有了如下的算法
class Solution:
def groupAnagrams(self, strs):
"""
:type strs: List[str]
:rtype: List[List[str]]
"""
strs_map = {}
result = []
for i in strs:
string = ''.join(sorted(i))
if string not in strs_map:
strs_map[string] = len(result)
result.append([string])
else:
result[strs_map[string]].append(string)
return result
或者我们的key
是排序好的str
,而value
是一个list
,里面存放的是没有排序的str
。
class Solution:
def groupAnagrams(self, strs):
"""
:type strs: List[str]
:rtype: List[List[str]]
"""
strs_map = {}
result = []
for string in strs:
tmp = ''.join(sorted(string))
if tmp in strs_map:
strs_map[tmp].append(string)
else:
strs_map[tmp] = [string]
for str_list in strs_map.values():
result.append(str_list)
return result
我更加喜欢第二种做法。
扫描二维码关注公众号,回复:
1548859 查看本文章
我们还有一种更pythonic
的写法
class Solution:
def groupAnagrams(self, strs):
"""
:type strs: List[str]
:rtype: List[List[str]]
"""
from collections import defaultdict
dic = defaultdict(list)
for s in strs:
dic["".join(sorted(s))].append(s)
return list(dic.values())
我将该问题的其他语言版本添加到了我的GitHub Leetcode
如有问题,希望大家指出!!!