机试打卡 -06 异位词分组(哈希表)

 


最容易想到的是利用 ord( ) 函数,按照字母计数的特征归类,代码如下:

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:

        ans_list=[]
        
        # 哈希表 {word_count:ans_list中的索引}
        word_count_dict=dict()

        # 遍历str
        for word in strs:

            # word 对应的字母计数元组
            word_count=self.Count_letters(word)
            
            # 若计数元组之前出现,则直接将word根据value值添加到ans_list中
            if word_count in word_count_dict:
                ans_list[word_count_dict[word_count]].append(word)

            # 若未出现,则将添加至哈希表,value值为len(ans_list)
            # 再将 [word] 添加至 ans_list 的末尾
            else:
                word_count_dict[word_count]=len(ans_list)
                ans_list.append([word])
        
        return ans_list


    def Count_letters(self,word):
        lst=[0]*26

        for letter in word:
            lst[ord(letter)-97]+=1
        
        # 此处必须转化成tuple元组
        #因为字典的key必须是可哈希的(即保持不变的--tuple)

        return tuple(lst)

①ord('a')==97。

②字典的key必须是可哈希的!

一个对象在其生命周期内,如果保持不变,就是hashable(可哈希的)。

hashable ≈ imutable     可哈希 ≈ 不可变

在Python中:

list、set和dictionary 都是可改变的,比如可以通过list.append(),set.remove(),dict[‘key‘] = value对其进行修改,所以它们都是不可哈希的;

而tuple和string是不可变的,只可以做复制或者切片等操作,所以它们就是可哈希的。

所以此处需要将 list转换为tuple 作为字典的key。


官方题解 方法一:排序

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:

        # 构建哈希表 {排序后的st:[]}    collections模块
        mp = collections.defaultdict(list)

        for st in strs:
            
            # sorted排序完成之后返回列表
            # "".join(list) 重新组合成字符串
            key = "".join(sorted(st))

            # 添加至对应value中
            mp[key].append(st)
        
        # 利用 dict.values() 方法
        #再用list()转换数据类型,直接返回结果列表

        return list(mp.values())

①sorted() 函数将返回一个排序后的列表,若需要重新组合成字符串,需使用 "".join()函数。

②dict.values() 将字典中的所有 value 全部取出,但需要使再用 list() 或 tuple() 转换数据类型;

dict.keys() 同理。


官方题解 方法二:计数

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())

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值