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

news/2024/12/2 13:05:15/

 


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

class Solution:def groupAnagrams(self, strs: List[str]) -> List[List[str]]:ans_list=[]# 哈希表 {word_count:ans_list中的索引}word_count_dict=dict()# 遍历strfor 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_listdef Count_letters(self,word):lst=[0]*26for 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] * 26for ch in st:counts[ord(ch) - ord("a")] += 1# 需要将 list 转换成 tuple 才能进行哈希mp[tuple(counts)].append(st)return list(mp.values())

 


http://www.ppmy.cn/news/78620.html

相关文章

面经之C++指针和引用的定义、区别、相同点

1.指针和引用的定义 (1)指针: 指针是一种数据类型,用于保存地址类型的数据。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。 int main() {int a 10; //定义整型变量a //指针定义语法: 数据类型 *…

Java JDK 版本管理工具之Jabba JEnv使用

文章目录 Java JDK 版本管理工具JEnv介绍下载地址配置环境变量到Path上使用JEnv添加JDK查看已经添加的JDK切换JDK版本 Jabba前言安装Jabba常用命令查看服务器上可下载安装的Jdk版本添加本地jdk查询所有安装的JDK版本安装JDK安装 Oracle JDK安装 Oracle Server JRE安装 Adopt Op…

学习笔记——SVG.js中的use和marker元素的相关方法

Use() use() use元素只是模拟另一个现有元素。主元素上的任何更改都将反映在所有使用实例上。use()的用法非常简单: var rect draw.rect(100, 100).fill(#f09) var use draw.use(rect).move(200, 200)在上述示例的情况下,sv…

大项目参考地址​编辑 大项目接口实现

目录 大项目参考地址​编辑 口语考试 纸笔口语考试通常会安排在笔试前一周至笔试后一周的任意一天,机考口语考试通常会安排在笔试当天或者与笔试日期尽可能相邻的日期。根据考务安排的需要,在特殊情况下,口试日期有可能超出此区间&#xff0…

ES6之生成器

文章目录 前言一、生成器是什么?二、生成器总结 前言 生成器 一、生成器是什么? 生成器就是一个特殊的函数,实现异步编程。格式function *名称(){...} (这个*靠近function写,靠近名称写,或者两边空格都不靠近均正确)…

1142 Maximal Clique(50行代码+超详细注释)

分数 25 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the clique are adjacent. A maximal clique is a clique that cannot be extended by including one …

一分钟带你了解网络安全(如何自学)

一、关于网络安全职业 早些年,网络安全刚起步,作为一个网络安全从业人员,最苦恼的事情就是每当回到村里变成狗蛋儿的时候,七大姑八大姨,邻里乡亲,村子里的各种人都会来找你,狗蛋儿,你…

对Android 说Hello ——Qt For Android

1. Qt 安卓环境搭建 平台:Qt5.15.2 官网教程: Getting Started with Qt for Android | Qt 5.15 网上的教程: qt5.15.2配置android_加油吧,小杜的博客-CSDN博客 注意 :注意ndk的路径中不能有空格,我之前…