【leetcode 49】【字母异位词分组】

leetcode49 字母异位词分组

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:

输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出:
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]


解题思路与代码思路:

在写代码的时候,发现难点在于对哈希表和python字典的运用,以及列表中的列表的拆解。写代码或思考时,最好在纸张上画一下

排序法

排序是对列表中的每个字符串做排序,异位词排完序后是相等的,可以把这个值作为key值放入字典,然后把共同的异位词都放在一个列表中作为value。在代码实现时,有两个重点:

  1. sorted(‘str’)得到的结果是列表,因为key值必须是不可变类型,所以要把列表转化为tuple
  2. 我们该如何把value存放为列表呢? ans = collections.defaultdict(list) ,这是一种方法,可以把value值看作list,不过需要导包。例外一种方法就是dict[key] = dict.get(key, []) + [item] ,get方法是获取key对应的值,若不存在就返回default=[],我们这里设置为列表,然后把需要添加的元素以列表形式相加即可。

字典获取value值得的类型是dict_values,最后需要返回的dict.values要转回list

计数法

其实这个方法与上一个的形式很相似,只是把key值用计数的方式存储。利用只有26个小写字母的特点,可以使用ascii码作为key,字母的计数作为value。使用与上面同样的方式返回正确答案


代码:

排序法
class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        dict = {}
        for item in strs:
            key = tuple(sorted(item))
            dict[key] = dict.get(key, []) + [item]
        return list(dict.values())
计数法
class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        res = {}
        for i in strs:
            new_str = [0]*26
            for j in i:
                new_str[ord(j)-ord('a')] +=1 
            key = tuple(new_str)
            res[key] = res.get(key,[])+[i]
        return list(res.values())


复 杂 度 分 析 : \color{red}{复杂度分析:}
  1. 排序法
  • 时间复杂度: O(NKlogK),N是列表长度,K是strs中字符串长度最大的值
  • 空间复杂度:O(NK),排序存储在字典的空间,有N次,每次最大存储为K
  1. 计数法:
  • 时间复杂度:O(NK)
  • 空间复杂度:O(NK)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值