代码编织梦想

 


最容易想到的是利用 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())

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_55818063/article/details/130854242

【数据结构】kmp算法概述-爱代码爱编程

KMP算法,全称为Knuth-Morris-Pratt算法,是一种用于字符串匹配的算法。它的核心思想是利用已知信息来避免无用的比较操作,从而提高算法效率。KMP算法的时间复杂度为O(n + m),其中n为模式串的长度,m为文

【数据结构与算法】- 周测一-爱代码爱编程

课程链接: 清华大学驭风计划 代码仓库:Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大

数据结构_查找_数据结构查找的相关操作-爱代码爱编程

目录 1. 查找的基本概念 2. 顺序查找和折半查找 2.1 顺序查找 2.1.1 一般线性表的顺序查找 2.1.2 有序表的顺序查找 2.2 折半查找 2.3 分块查找 2.4 相关练习 3. 树型查找         3.1 二叉排序树 3.1.1 二叉排序树的定义 3.1.2 二叉排序树的查找 3.1.3 二叉排序树的插

622. 设计循环队列-爱代码爱编程

622. 设计循环队列 Java实现循环队列设计 题目描述 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。