给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 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]
仅包含小写字母
这道题读完觉得很简单,但是真的要写时却无从下笔。
主要有以下几个问题:
匹配的模板需要在列表里动态寻找,而不是给定?
如何判断顺序不同的两个字符串完全含有相同元素?
如何确保返回的结果中不会包含重复的元素?
对于这三个问题,其实都有一个统一的解答:将排序后的字符串作为这组字符串的唯一确定的匹配模板。
不包含重复元素的类型,有set还有dict的key,我们可以用字典来去重,不唯一的value就可以作为最终的返回值,那唯一的key,我们可以使用排序后的字符串(相同字母组成的字符串排序后相同)。
class Solution(object):
def groupAnagrams(self, strs):
"""
:type strs: List[str]
:rtype: List[List[str]]
"""
ans = {}
for item in strs:
key = "".join(sorted(item))
if ans.get(key):
ans[key].append(item)
else:
ans[key] = [item]
return list(ans.values())
官方题解有更方便的函数可以替代我的if。
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
mp = collections.defaultdict(list)
for st in strs:
key = "".join(sorted(st))
mp[key].append(st)
return list(mp.values())
collections.defaultdict,如果在字典中查找一个不存在的键,defaultdict会自动为该键创建一个条目(类型),并将默认值赋给这个键。