每日一题,力扣leetcode Hot100之49. 字母异位词分组

 

该题用哈希表解答,具有统一特征的作为哈希表的键名,然后满足要求的作为值

解法一:

我们将每个字符串进行排序,如果排序后的结果相同,则可以认为是字母异位词,我们将排序后的结果作为哈希表的key,然后满足要求的作为value。

最后结果返回以list格式的哈希表的value,既可满足题目要求。。

import collections
class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        mp=collections.defaultdict(list)
        for str in strs:
            mp[''.join(sorted(str))].append(str)
        return list(mp.values())  

解法二:

字母异位词的每个词中的每个字母出现的次数一定是一样的,我们将字母出现次数的列表作为哈希表的key把符合要求的作为value即可。

因为都是小写字母,我们初始化一个26大小全为0的数组,并且遍历整个字符串,把字母的次数加上对应的字母位置上。

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        mp = collections.defaultdict(list)

        for st in strs:
            counts = [0] * 26
            for ch in st:
                counts[ord(ch) - ord("a")] += 1
            # 需要将 list 转换成 tuple 才能进行哈希
            mp[tuple(counts)].append(st)
        
        return list(mp.values())

ord('b')-ord('a)=1故在数组的第一个位置+1。

ord('a')-ord('a)=0故在数组的第0个位置+1。

这样就刚好对应上了字母表的顺序。

返回的时候要把key转换为tuple才行,如果是列表的话会报错。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值