49. 字母异位词分组
https://leetcode-cn.com/problems/group-anagrams/
解法一:
类似242.有效的字母异位词
sorted之后相等的词即是同一组异位词。
>>> s = 'bate'
>>> sorted(s)
['a', 'b', 'e', 't']
将字符串传入py的sorted函数,会返回一个列表,里面的字符按序排列 然后将其作为键存入字典中,值为字符串列表。每次对一个新串,排列后与字典键比较,存入键相同的列表中
这里用了一个defaultdict,需要引入collections包。其作用是免除了键值不存在时的初始化,例如用字典统计词频时,每次都要判断键值是否存在。defaultdict()传入一个函数,用于键值初次填入时的默认值:
>>> from collections import defaultdict
>>> dd = defaultdict(list)
>>> dd
defaultdict(<type 'list'>, {})
>>> dd['foo']
[]
>>> dd
defaultdict(<type 'list'>, {'foo': []})
>>> dd['bar'].append('quux')
>>> dd
defaultdict(<type 'list'>, {'foo': [], 'bar': ['quux']})
此外还要注意,sorted()将字符串排序后返回的是list,而list是不可哈希的,不能用于键值,很好理解,以为list是可变的,应该转为tuple。
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
ans = collections.defaultdict(list) #创建defaultdict
for s in strs:
ans[tuple(sorted(s))].append(s) #注意将sorted返回的结果转成tuple
return list(ans.values()) #ans的value是dict_values类型,注意转成list
解法二:
原理解法1 差不多。用一个长为26的数组作字典键,值为字符串list。数组统计字符串中每个字符的词频,每组字符串的词频都是一样的,且和其他组不同。
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
ans = collections.defaultdict(list)
for s in strs:
count = [0] * 26 #词频记录
for c in s: #统计词频
count[ord(c) - ord('a')] += 1
ans[tuple(count)].append(s) #注意count要转成tuple
return list(ans.values())
最后更新于