当前位置: 首页 > news >正文

LeetCode 热题 100 49. 字母异位词分组

LeetCode 热题 100 | 49. 字母异位词分组

大家好,今天我们来解决一道经典的算法题——字母异位词分组。这道题在LeetCode上被标记为中等难度,要求我们将字母异位词组合在一起。下面我将详细讲解解题思路,并附上Python代码实现。


问题描述

给定一个字符串数组 strs,将其中所有字母异位词组合在一起。字母异位词是指由相同字母重新排列形成的单词。

示例:

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

解题思路

核心思想
  1. 哈希表分组

    • 使用哈希表(字典)来存储字母异位词的分组结果。
    • 将每个字符串排序后的结果作为哈希表的键,原始字符串作为值。
  2. 排序作为键

    • 由于字母异位词排序后的结果相同,可以将排序后的字符串作为哈希表的键。
  3. 返回结果

    • 遍历哈希表的值,将分组结果存入列表并返回。

Python代码实现

def groupAnagrams(strs):from collections import defaultdict# 使用 defaultdict 初始化哈希表anagrams = defaultdict(list)# 遍历字符串数组for s in strs:# 将字符串排序后作为键sorted_s = ''.join(sorted(s))# 将原始字符串添加到对应的分组中anagrams[sorted_s].append(s)# 返回分组结果return list(anagrams.values())# 测试示例
strs1 = ["eat", "tea", "tan", "ate", "nat", "bat"]
strs2 = [""]
strs3 = ["a"]print(groupAnagrams(strs1))  # 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
print(groupAnagrams(strs2))  # 输出: [[""]]
print(groupAnagrams(strs3))  # 输出: [["a"]]

代码解析

  1. 哈希表初始化

    • 使用 defaultdict(list) 创建一个哈希表,键为排序后的字符串,值为原始字符串列表。
  2. 遍历字符串数组

    • 对每个字符串进行排序,并将排序后的字符串作为键,原始字符串添加到对应的列表中。
  3. 返回结果

    • 将哈希表的值转换为列表并返回。

复杂度分析

  • 时间复杂度:O(n * k log k),其中 n 是字符串数组的长度,k 是字符串的最大长度。排序每个字符串的时间复杂度为 O(k log k)。
  • 空间复杂度:O(n * k),用于存储哈希表。

示例运行

示例1
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例2
输入: strs = [""]
输出: [[""]]
示例3
输入: strs = ["a"]
输出: [["a"]]

优化思路

如果字符串长度较短,可以使用字符计数作为哈希表的键,进一步优化时间复杂度。

优化代码
def groupAnagrams_optimized(strs):from collections import defaultdictanagrams = defaultdict(list)for s in strs:# 使用字符计数作为键count = [0] * 26for char in s:count[ord(char) - ord('a')] += 1# 将字符计数转换为元组(因为列表不能作为哈希表的键)anagrams[tuple(count)].append(s)return list(anagrams.values())# 测试示例
strs1 = ["eat", "tea", "tan", "ate", "nat", "bat"]
strs2 = [""]
strs3 = ["a"]print(groupAnagrams_optimized(strs1))  # 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
print(groupAnagrams_optimized(strs2))  # 输出: [[""]]
print(groupAnagrams_optimized(strs3))  # 输出: [["a"]]

优化代码解析

  1. 字符计数

    • 使用长度为26的列表记录每个字符的出现次数。
    • 将字符计数转换为元组(因为列表不能作为哈希表的键)。
  2. 时间复杂度

    • 时间复杂度为 O(n * k),其中 n 是字符串数组的长度,k 是字符串的最大长度。

总结

通过使用哈希表,我们可以高效地将字母异位词分组。排序法和字符计数法各有优劣,可以根据实际需求选择合适的方法。希望这篇题解对大家有所帮助,如果有任何问题,欢迎在评论区留言讨论!

关注我,获取更多算法题解和编程技巧!

相关文章:

LeetCode 热题 100 49. 字母异位词分组

LeetCode 热题 100 | 49. 字母异位词分组 大家好,今天我们来解决一道经典的算法题——字母异位词分组。这道题在LeetCode上被标记为中等难度,要求我们将字母异位词组合在一起。下面我将详细讲解解题思路,并附上Python代码实现。 问题描述 给…...

从 DeepSeek 到飞算 JavaAI:AI 开发工具如何重塑技术生态?

在科技飞速发展的当下,AI 开发工具正以前所未有的态势重塑技术生态。从备受瞩目的 DeepSeek 到崭露头角的飞算 JavaAI,它们在不同维度上推动着软件开发领域的变革,深刻影响着开发者的工作方式与行业发展走向。 DeepSeek:AI 开发领…...

OceanBase 初探学习历程之二——操作系统参数最佳实践

本文章分享OB操作系统参数最佳实践值,相关参数部分来自PK项目得知,仅供参考,实际参数设置仍需结合现有设备条件及业务系统特点是否有必要如此设置,但我任务大部分场景均可用(仅本人个人观点)。 1、磁盘配置…...

全面指南:使用JMeter进行性能压测与性能优化(中间件压测、数据库压测、分布式集群压测、调优)

目录 一、性能测试的指标 1、并发量 2、响应时间 3、错误率 4、吞吐量 5、资源使用率 二、压测全流程 三、其他注意点 1、并发和吞吐量的关系 2、并发和线程的关系 四、调优及分布式集群压测(待仔细学习) 1.线程数量超过单机承载能力时的解决…...

《机器学习实战》专栏 No12:项目实战—端到端的机器学习项目Kaggle糖尿病预测

《机器学习实战》专栏 第12集:项目实战——端到端的机器学习项目Kaggle糖尿病预测 本集为专栏最后一集,本专栏的特点是短平快,聚焦重点,不长篇大论纠缠于理论,而是在介绍基础理论框架基础上,快速切入实战项…...

【vue项目中如何实现一段文字跑马灯效果】

在Vue项目中实现一段文字跑马灯效果,可以通过多种方式实现,以下是几种常见的方法: 方法一:使用CSS动画和Vue数据绑定 这种方法通过CSS动画实现文字的滚动效果,并结合Vue的数据绑定动态更新文本内容。 步骤&#xff…...

DeepSeek 细节之 MLA (Multi-head Latent Attention)

DeepSeek 系统模型的基本架构仍然基于Transformer框架,为了实现高效推理和经济高效的训练,DeepSeek 还采用了MLA(多头潜在注意力)。 MHA(多头注意力)通过多个注意力头并行工作捕捉序列特征,但面临高计算成本…...

Python爬虫具体是如何解析商品信息的?

在使用Python爬虫解析亚马逊商品信息时,通常会结合requests库和BeautifulSoup库来实现。requests用于发送HTTP请求并获取网页内容,而BeautifulSoup则用于解析HTML页面并提取所需数据。以下是具体的解析过程,以按关键字搜索亚马逊商品为例。 …...

lerobot调试记录

这里写自定义目录标题 libtiff.so undefined symbol libtiff.so undefined symbol anaconda3/envs/lerobot3/lib/python3.10/site-packages/../.././libtiff.so.6: undefined symbol: jpeg12_write_raw_data, version LIBJPEG_8.01.安装库 conda install -c conda-forge jpeg …...

【Word转PDF】在线Doc/Docx转换为PDF格式 免费在线转换 功能强大好用

在日常办公和学习中,将Word文档转换为PDF格式的需求非常普遍。无论是制作简历、撰写报告还是分享文件,都需要确保文档格式在不同设备上保持一致。而小白工具的“Word转PDF”功能正是为此需求量身打造的一款高效解决方案。 【Word转PDF】在线Doc/Docx转换…...

Jenkins 配置 Credentials 凭证

Jenkins 配置 Credentials 凭证 一、创建凭证 Dashboard -> Manage Jenkins -> Manage Credentials 在 Domain 列随便点击一个 (global) 二、添加 凭证 点击左侧 Add Credentials 四、填写凭证 Kind:凭证类型 Username with password: 配置 用…...

Datawhale Ollama教程笔记5

Dify 接入 Ollama 部署的本地模型 Dify 支持接入 Ollama 部署的大型语言模型推理和 embedding 能力。 快速接入 下载 Ollama 访问 Ollama 安装与配置,查看 Ollama 本地部署教程。 运行 Ollama 并与 Llama 聊天 ollama run llama3.1Copy to clipboardErrorCopied …...

小爱音箱连接电脑外放之后,浏览器网页视频暂停播放后,音箱整体没声音问题解决

背景 22年买的小爱音箱增强版play,小爱音箱连接电脑外放之后,浏览器网页视频暂停播放后,音箱整体没声音(一边打着游戏,一边听歌,一边放视频,视频一暂停,什么声音都没了,…...

go设置镜像代理

前言 在 Go 开发中,如果直接从官方源(https://proxy.golang.org)下载依赖包速度较慢,可以通过设置 镜像代理 来加速依赖包的下载。以下是增加 Go 镜像代理的详细方法: 一、设置 Go 镜像代理 1. 使用环境变量设置代理…...

Python爬虫系列教程之第十二篇:爬虫异常处理与日志记录

大家好,欢迎继续关注本系列爬虫教程!在实际的爬虫项目中,网络请求可能会因为各种原因失败,如连接超时、目标服务器拒绝访问、解析错误等。此外,大规模爬虫任务运行过程中,各种异常情况层出不穷,…...

将Google文档导入WordPress:简单实用的几种方法

Google文档是内容创作者非常实用的写作工具。它支持在线编辑、多人协作,并能够自动保存内容。但当我们想把Google文档中的内容导入WordPress网站时,可能会遇到一些小麻烦,比如格式错乱、图片丢失等问题。本文将为大家介绍几种简单实用的方法&…...

大白话实战Gateway

网关功能 网关在分布式系统中起了什么作用?参考下图: 前端想要访问业务访问,就需要知道各个访问的地址,而业务集群服务有很多,前端需要记录非常多的服务器地址,这种情况下,我们需要对整个业务集群做一个整体屏蔽,这个时候就引入Gateway网关,它就是所有服务的请求入…...

深入学习解析:183页可编辑PPT华为市场营销MPR+LTC流程规划方案

华为终端正面临销售模式转型的关键时刻,旨在通过构建MPRLTC项目,以规避对运营商定制的过度依赖,并探索新的增长路径。项目核心在于建设一套全新的销售流程与IT系统,支撑双品牌及自有品牌的战略发展。 项目总体方案聚焦于四大关键议…...

【微中子代理踩坑-前端node-sass安装失败】

微中子代理踩坑-前端node-sass安装失败-windows 1.npm版本2.python2.73.安装Visual Studio 1.npm版本 当前使用node版本13.12.0 2.python2.7 安装python2.7.9并配置环境变量 3.安装Visual Studio 安装Visual Studio 我是直接勾选了3个windows的sdk,然后就好了 最后 npm in…...

使用open-webui+deepseek构建本地AI知识库

序 本文主要研究一下如何使用OpenWebUIdeepseek构建本地AI知识库 步骤 拉取open-webui镜像 docker pull ghcr.io/open-webui/open-webui:maindocker启动 docker run -d -p 3000:8080 \ -e OLLAMA_BASE_URLhttp://host.docker.internal:11434 \ ghcr.io/open-webui/open-we…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

龙虎榜——20250610

上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...