caisense的专栏

诗和远方

49. Group Anagrams

https://leetcode.com/problems/group-anagrams/description/
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

思路1:将每个字符串拆分,每个字母按序排列

>>> 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。

总结:
(1)list、set、dict:是不可哈希的
(2)int、float、str、tuple:是可以哈希的
(3)list 不使用 hash 值进行索引,故其对所存储元素没有可哈希的要求;set / dict 使用 hash 值进行索引,也即其要求欲存储的元素有可哈希的要求。
(4)dict 仅对键(key)有可哈希的要求,对值(value)无此要求。
https://blog.csdn.net/pyufftj/article/details/72366631

class Solution:
    def groupAnagrams(self, strs):
        """
        :type strs: List[str]
        :rtype: 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

思路2:用一个长为26的数组作字典键,值为字符串list。数组统计字符串中每个字符的词频,每组字符串的词频都是一样的,且和其他组不同。原理和思路1 差不多。

class Solution:
    def groupAnagrams(self, strs):
        """
        :type strs: List[str]
        :rtype: 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())
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012033124/article/details/80686446
个人分类: LeetCode
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭