(day21)leecode hot100字母异位词分组

描述

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

思想:对于相同字母排列组合形成的字符串用sorted方法就变成一致啦;

class Solution:def groupAnagrams(self, strs: List[str]) -> List[List[str]]:table = {}  # 初始化一个空字典,用于存储变位词组for s in strs:  # 遍历输入的字符串列表s_ = ''.join(sorted(s))  # 对字符串进行排序,并将排序后的字符连接成一个新的字符串if s_ not in table:  # 如果排序后的字符串不在字典中table[s_] = [s]  # 将排序后的字符串作为键,并将原始字符串放入列表中作为值else:table[s_].append(s)  # 如果排序后的字符串已经在字典中,则将原始字符串添加到对应的列表中# table[s_] = table[s_] + [s] if s_ in table else [s]# 上面的if-else语句可以直接用以上语句代替return list(table.values())  # 返回字典中所有值的列表,即变位词分组的列表

这段代码利用哈希表将输入字符串按变位词分组。通过对每个字符串进行排序作为键,可以快速将变位词归为一组,最终返回所有分组结果。 

  • 初始化一个空字典: 创建一个空的哈希表(字典)来存储分组结果。字典的键是经过排序的字符串,值是包含这些字符的原始字符串的列表。

  • 遍历输入字符串列表: 遍历每个输入的字符串。

  • 排序字符串: 对当前字符串进行排序,将排序后的字符串作为字典的键。这一步确保了所有变位词具有相同的键,因为变位词排序后结果是相同的。

  • 将字符串添加到字典:

    • 如果排序后的字符串不在字典中,创建一个新的键值对。键是排序后的字符串,值是一个包含当前字符串的列表。
    • 如果排序后的字符串已经在字典中,将当前字符串添加到对应的列表中。
  • 返回分组结果: 遍历完所有字符串后,字典的值部分即为变位词的分组结果。将这些值转换为列表并返回。

from collections import defaultdict  # 从 collections 模块中导入 defaultdictclass Solution:def groupAnagrams(self, strs: List[str]) -> List[List[str]]:d = defaultdict(list)  # 初始化一个 defaultdict,默认值为空列表,用于存储变位词组for s in strs:  # 遍历输入的字符串列表d[''.join(sorted(s))].append(s)  # 对字符串进行排序,并将其加入排序后的字符串对应的列表中return list(d.values())  # 返回字典中所有值的列表,即变位词分组的列表

初始化一个空的 defaultdict,我们称之为 d。

遍历输入字符串数组 strs: 对于第一个字符串 "eat",排序后为 "aet",将它加入到键为 "aet" 的列表中。 对于第二个字符串 "tea",排序后也为 "aet",因此也加入到键为 "aet" 的列表中。 对于第三个字符串 "tan",排序后为 "ant",将它加入到键为 "ant" 的列表中。 对于第四个字符串 "ate",排序后为 "aet",同样加入到键为 "aet" 的列表中。 对于第五个字符串 "nat",排序后为 "ant",同样加入到键为 "ant" 的列表中。 对于最后一个字符串 "bat",排序后为 "abt",将它加入到键为 "abt" 的列表中。

 最终,我们得到的 d 字典如下所示: { 'aet': ['eat', 'tea', 'ate'], 'ant': ['tan', 'nat'], 'abt': ['bat'] } 将 d 字典的所有值转换为列表并返回,即 [['eat', 'tea', 'ate'], ['tan', 'nat'], ['bat']]。 

defaultdict函数 

defaultdict 是 Python 标准库 collections 模块中的一个类,它扩展了普通字典(dict)的功能。默认字典的功能与dict基本相同,但在访问一个不存在的key时,默认字典会提供一个默认值,而不是引发异常。

创建不同类型的默认字典。

    默认字典的构造函数接受一个工厂函数default_factory作为参数,可以将一个类型名看做是一个工厂函数,比如list,tuple,str等。

这个函数会在要生成默认值的时候无参调用,如果使用类型名作为工厂函数,则这个类型必须要有无参构造函数, 比如

import collectionsdef GetIntdd():dd = collections.defaultdict(int)print(dd)def GetListdd():dd = collections.defaultdict(list)print(dd)def GetTupledd():dd = collections.defaultdict(tuple)print(dd)def GetStrdd():dd = collections.defaultdict(str)print(dd)for func_name in [f for f in globals() if callable(globals().get(f)) and f.startswith("Get")]:globals()[func_name]()

结果如下:

defaultdict(<class 'int'>, {})                     
defaultdict(<class 'list'>, {})
defaultdict(<class 'tuple'>, {})
defaultdict(<class 'str'>, {})

若 print(dd)改为print(dd['a']),则结果为

0
[]
()

   (此处为空字符串)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/48528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Log4J reminder

Java JNDI and Log injection https://docs.oracle.com/javase/jndi/tutorial/ See also https://telegra.ph/Log4J-Vulnerability-Explained-07-21

【轻松拿捏】java中为什么要使用克隆?如何实现对象克隆?深拷贝和浅拷贝区别是什么?

java中为什么要使用克隆&#xff1f;如何实现对象克隆&#xff1f;深拷贝和浅拷贝区别是什么&#xff1f; 一、如何在Java中实现对象克隆 1.1 浅拷贝 1.2 深拷贝 1.3 区别总结 二、面试回答技巧 1. 定义克隆及其用途 2. 解释浅拷贝和深拷贝 3. 具体实现浅拷贝和深拷贝 …

ChatGPT:@EnableConfigurationProperties 和 @ConfigurationProperties注解

ChatGPT&#xff1a;EnableConfigurationProperties 和 ConfigurationProperties注解 EnableConfigurationProperties(ServiceProperties.class) ConfigurationProperties(prefix “cestc”) 这两个注解的关系 EnableConfigurationProperties 和 ConfigurationProperties 是 …

c++中 bitset set multiset 的用法

bitset 简介 bitset 是 c 标准库中的一个存储 0/1 的大小不可变的容器。严格来讲&#xff0c;它并不属于 STL。 内存变量为 bool 类型。 #include<bitset> // 头文件bitset<1000> bs; // 定义一个大小为 1000 长度的 bitset 容器&#xff0c;其中 每一位都为fal…

springboot中如果我想每个接口对应redis应该怎么做? 更改的时候只删除对应的缓存?

如果你想为每个接口设置对应的Redis缓存,并且在更改数据时只删除对应的缓存,可以按照以下步骤进行设计和实现: 为每个接口设计唯一的缓存键 为了区分不同接口的缓存,你需要为每个接口设计一个唯一的缓存键。缓存键可以包含接口的名称、参数等信息,以确保唯一性。例如: "sp…

在C#中,如何优化对象的创建和销毁以提高性能?

在C#中&#xff0c;优化对象的创建和销毁可以显著提高应用程序的性能。以下是一些常用的优化策略&#xff1a; 避免不必要的对象创建&#xff1a; 检查代码&#xff0c;避免在循环中创建临时对象。考虑重用对象或使用对象池。 使用值类型&#xff08;ValueType&#xff09;&am…

深度加速器 全面支持国服外服游戏加速

深度加速器现已部署多条高速游戏专线。支持港服&#xff1b;日服、韩服、台服、东南亚服、中东服、美服、澳服、欧服、俄服游戏登录和加速&#xff0c;深度加速器且提供国内外游戏加速功能。 深度IP转换器与深度加速器&#xff1a;两个产品功能有所不同&#xff0c;深度IP转换器…

【Python】使用库 -- 详解

库就是别人已经写好了的代码&#xff0c;可以让我们直接拿来用。 一个编程语言能不能流行起来&#xff0c;一方面取决于语法是否简单方便容易学习&#xff0c;一方面取决于生态是否完备。所谓的 “生态” 指的就是语言是否有足够丰富的库&#xff0c;来应对各种各样的场景。在…

LeetCode 188题: 买卖股票的最佳时机IV优化(原创)

之前完成了LeetCode 188题&#xff1a; 买卖股票的最佳时机IV&#xff08;原创&#xff09;-CSDN博客&#xff0c;虽然完成代码编写&#xff0c;并提交成功&#xff0c;但运行效率还未达到最优的1ms&#xff0c;见下图&#xff1a; 仔细检查代码&#xff0c;感觉还是有可优化的…

OpenCV中的GrabCut图像分割算法的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 功能描述 GrabCut 算法是一种用于图像分割的技术&#xff0c;由 Carsten Rother、Vladimir Kolmogorov 和 Andrew Blake 在 2004 年 SIGGRAPH 会议的论文《…

AI多模态识别ALM大模型分享:Qwen-Audio

ALM (Large Audio Language Model) 1&#xff09;Qwen-Audio 声音音频对话 参考&#xff1a; https://qwen-audio.github.io/Qwen-Audio/ https://huggingface.co/Qwen/Qwen-Audio-Chat “Qwen-Audio 接受多种音频&#xff08;人类语音、自然声音、音乐和歌曲&#xff09;以及…

基于面向对象和递归的拦截器设计模式

1 定义 拦截器模式&#xff08;Interceptor Pattern&#xff09;&#xff0c;是指提供一种通用的扩展机制&#xff0c;可以在业务操作前后提供一些切面的&#xff08;Cross-Cutting&#xff09;的操作。这些切面操作通常是和业务无关的&#xff0c;比如日志记录、性能统计、安…

day2 单机并发缓存

文章目录 1 sync.Mutex2 支持并发读写3 主体结构 Group3.1 回调 Getter3.2 Group 的定义3.3 Group 的 Get 方法 4 测试 本文代码地址&#xff1a; https://gitee.com/lymgoforIT/gee-cache/tree/master/day2-single-node 本文是7天用Go从零实现分布式缓存GeeCache的第二篇。 …

【LeetCode】80.删除有序数组中的重复项II

1. 题目 2. 分析 3. 代码 class Solution:def removeDuplicates(self, nums: List[int]) -> int:if len(nums) < 3:return len(nums)i 0j 1k 2while(k < len(nums)):if (nums[i] nums[j]):while(k < len(nums) and nums[j] nums[k] ):k1if (k < len(nums…

校验deb、rpm、apt、yum安装文件完整性测试

简介&#xff1a;deb包在Linux操作系统中类似于windows中的软件包&#xff08;msi&#xff09;&#xff0c;几乎不需要什么复杂的编译即可通过鼠标点击安装使用。此外,deb广泛应用于越狱后iOS软件及MeeGo&#xff08;含Maemo软件&#xff09;中。deb 格式是 Debian 系统(包含 D…

Docker安装ELK(简易版)

1、下载ELK镜像&#xff1a;打开终端&#xff0c;并执行以下命令以下载Elasticsearch、Logstash和Kibana的Docker镜像。您也可以根据需要选择其他版本&#xff1a; docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.6 docker pull docker.elastic.co/logstash…

StringBuilder和StringBuffer

目录 &#xff08;一&#xff09;为什么要引入StringBuilder和StringBuffer &#xff08;二&#xff09;StringBuilder和StringBuffer &#xff08;1&#xff09;底层数组长度 (2)StringBuilder与StringBuffer扩容机制 &#xff08;3&#xff09;StringBuilder和StringBuf…

并发编程面试题1

并发编程 1、线程池中提交一个任务的流程是怎样的&#xff1f; 1、提交任务&#xff1a;首先&#xff0c;一个任务被提交到线程池。这个任务通常是一个实现了Runnable或Callable接口的对象&#xff1b; 2、检测线程池状态&#xff1a;线程池会首先检测其运行状态。如果线程池…

javafx使用发现的问题

1.按钮的方法 如果在fxml按钮的方法报错&#xff0c;并且你已在lei中添加了它的按钮及其按钮方法&#xff0c;那么可能是FXML和控制器类未正确关联&#xff1a; 确保你的FXML文件通过 fx:controller 属性正确指定了与之关联的控制器类。例如&#xff0c;fx:controller"c…

数据库之存储引擎

目录 一、MySQL支持的存储引擎 二、查看MySQL默认存储引擎 三、修改MySQL默认存储引擎 四、常用的存储引擎 1.InnoDB 2.MyISAM 3.MEMORY 一、MySQL支持的存储引擎 使用SHOW ENGINES \G; 命令查看 以“\G”结尾&#xff0c;其作用是将查询结果按列显示。 Engine&#xff…