Java详解LeetCode 热题 100(02):LeetCode 49. 字母异位词分组(Group Anagrams)详解
文章目录
- 1. 题目描述
- 2. 理解题目
- 3. 解法一:排序法
- 3.1 思路
- 3.2 Java代码实现
- 3.3 代码详解
- 3.4 复杂度分析
- 3.5 适用场景
- 4. 解法二:计数法
- 4.1 思路
- 4.2 Java代码实现
- 4.3 代码详解
- 4.4 复杂度分析
- 4.5 适用场景
- 5. 解法三:字符串哈希法
- 5.1 思路
- 5.2 Java代码实现
- 5.3 代码详解
- 5.4 复杂度分析
- 5.5 与其他方法的对比
- 6. 性能优化与改进
- 6.1 优化排序法
- 6.2 使用懒加载策略
- 7. 常见问题与解答
- 7.1 如何处理空字符串?
- 7.2 如何处理大量数据?
- 7.3 如何提高空间效率?
- 8. 完整的 Java 解决方案
- 9. 实际应用与扩展
- 9.1 应用场景
- 9.2 扩展问题
- 10. 测试用例
- 11. 总结与技巧
- 11.1 解题要点
- 11.2 常用技巧
- 11.3 面试技巧
1. 题目描述
给你一个字符串数组 strs
,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 1:
输入: strs = ["eat","tea","tan","ate","nat","bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
- 1 <= strs.length <= 10^4
- 0 <= strs[i].length <= 100
strs[i]
仅包含小写字母
2. 理解题目
这道题要求我们把字母异位词分到同一组。字母异位词是指两个单词包含相同的字母,但是字母的排列顺序不同。例如,"eat"和"tea"就是字母异位词,因为它们都由字母’e’、‘a’、't’组成。
关键点:
- 字母异位词包含相同的字母,只是排列顺序不同
- 我们需要将所有字母异位词放到同一组
- 输出可以按任意顺序
3. 解法一:排序法
3.1 思路
最直观的方法是对字符串进行排序。字母异位词排序后会得到相同的字符串,我们可以将排序后的字符串作为键,原字符串作为值,存入哈希表中。
具体步骤:
- 创建一个哈希表,键为排序后的字符串,值为字母异位词列表
- 遍历输入数组中的每个字符串
- 将当前字符串排序,得到排序后的字符串
- 如果哈希表中已有该排序后的字符串作为键,则将当前字符串添加到对应值的列表中
- 否则,在哈希表中创建一个新的键值对
- 最后,返回哈希表的所有值,即为分组结果
3.2 Java代码实现
import java.util.*;public class Solution {public List<List<String>> groupAnagrams(String[] strs) {// 特殊情况处理if (strs == null || strs.length == 0) {return new ArrayList<>();}// 创建哈希表,键为排序后的字符串,值为原字符串列表Map<String, List<String>> map = new HashMap<>();// 遍历所有字符串for (String str : strs) {// 将字符串转换为字符数组并排序char[] chars = str.toCharArray();Arrays.sort(chars);String sortedStr = new String(chars);// 如果哈希表中没有这个排序后的字符串,创建一个新列表if (!map.containsKey(sortedStr)) {map.put(sortedStr, new ArrayList<>());}// 将原字符串添加到对应列表中map.get(sortedStr).add(str);}// 返回哈希表的所有值return new ArrayList<>(map.values());}
}
3.3 代码详解
- 首先检查输入是否为空,如果是,返回空列表
- 创建一个
HashMap
,键是排序后的字符串,值是原字符串的列表 - 遍历输入数组中的每个字符串:
- 将字符串转换为字符数组,便于排序
- 对字符数组进行排序
- 将排序后的字符数组转换回字符串,作为键
- 检查哈希表中是否已有该键,如果没有,创建一个新的列表
- 将原字符串添加到对应键的列表中
- 最后,通过
map.values()
获取所有值(即所有分组),转换为List返回
3.4 复杂度分析
- 时间复杂度:O(n * k * log k),其中n是输入数组的长度,k是字符串的最大长度
- 遍历n个字符串需要O(n)
- 对每个字符串排序需要O(k * log k)
- 总体时间复杂度为O(n * k * log k)
- 空间复杂度:O(n * k)
- 哈希表需要存储所有字符串,最坏情况下需要O(n * k)的空间
3.5 适用场景
排序法直观易懂,适用于大多数情况。当字符串长度不是很大时,这种方法效率较高。
4. 解法二:计数法
4.1 思路
由于题目限定只包含小写字母,我们可以用一个长度为26的数组来统计每个字符串中各个字母的出现次数。具有相同字母计数的字符串就是字母异位词。
具体步骤:
- 创建一个哈希表,键为字符计数的字符串表示,值为原字符串列表
- 遍历每个输入字符串,统计每个字母的出现次数
- 将统计结果转化为一个唯一的字符串表示,例如
#1#2#0#0...
表示’a’出现1次,'b’出现2次,'c’和’d’都不出现… - 使用这个唯一表示作为键,将原字符串加入对应的列表
- 返回哈希表的所有值
4.2 Java代码实现
import java.util.*;public class Solution {public List<List<String>> groupAnagrams(String[] strs) {if (strs == null || strs.length == 0) {return new ArrayList<>();}Map<String, List<String>> map = new HashMap<>();for (String str : strs) {// 创建一个长度为26的数组,表示26个小写字母int[] counts = new int[26];// 统计每个字母的出现次数for (char c : str.toCharArray()) {counts[c - 'a']++;}// 将计数数组转换为唯一的字符串表示StringBuilder sb = new
相关文章:
Java详解LeetCode 热题 100(02):LeetCode 49. 字母异位词分组(Group Anagrams)详解
文章目录 1. 题目描述2. 理解题目3. 解法一:排序法3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 适用场景4. 解法二:计数法4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 适用场景5. 解法三:字符串哈希法5.1 思路5.2 Java代码实现5.3 代码详解5.4 复杂…...
【每日随笔】文化属性 ① ( 天机 | 强势文化与弱势文化 | 文化属性的形成与改变 | 强势文化 具备的特点 )
文章目录 一、文化属性1、天机2、文化属性的强势文化与弱势文化强势文化弱势文化 二、文化属性的形成与改变1、文化属性形成2、文化属性改变3、文化知识的阶层 三、强势文化 具备的 特点 一、文化属性 1、天机 如果想要 了解这个世界的 底层架构 , 就需要掌握 洞察事物本质 的能…...
Java + Seleium4.X + TestNG自动化技术
系列文章目录 文章目录 系列文章目录前言一、 Java版Selenium自动化测试框架介绍和原理1.1 什么是Seleium1.2 特点1.3 注意点 二、安装SeleiumChrome环境 创建Maven项目2.1 安装Seleium Chrome环境2.2 Maven环境 三、Selenium4.X UI元素定位实战3.1 ID选择器3.2 Name选择器3.…...
Spark SQL核心概念与编程实战:从DataFrame到DataSet的结构化数据处理
一、Spark-SQL是什么 Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。 二、Hive and SparkSQL SparkSQL 的前身是 Shark,Shark是给熟悉 RDBMS 但又不理解 MapReduce 的技术人员提供的快速上手的工具。 Hive 是早期唯一运行在 Hadoop 上的 S…...
electron-vite 应用打包自定义图标不显示问题
// 修改electron-builder.yml ... win:executableName: xxx //可执行文件名称icon: build/icon.ico //你的图标路径 ...打包后,自定义图标不显示原因: 1 cannot execute causeexit status 2,安装包无法生成 用管理员身份运行,win11右击开始…...
AI中Token的理解与使用总结
AI中Token的理解与使用总结 什么是Token 在AI领域,特别是自然语言处理(NLP)中,Token是指将文本分割成的最小处理单元。Tokenization(分词)是将原始文本分解为Token的过程。 Token的几种形式 单词级Token:以单词为基本单位 示例:“Hello world” → [“Hello”, “world”…...
C++/SDL 进阶游戏开发 —— 双人塔防(代号:村庄保卫战 14)
🎁个人主页:工藤新一 🔍系列专栏:C面向对象(类和对象篇) 🌟心中的天空之城,终会照亮我前方的路 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录 二…...
全栈量子跃迁:当Shor算法破解RSA时,我们如何用晶格密码重构数字世界的信任基岩?
一、量子威胁的降维打击 1. Shor算法的毁灭性力量 # Shor算法量子电路简化示例(Qiskit实现) from qiskit import QuantumCircuit from qiskit.circuit.library import QFTdef shor_circuit(n: int, a: int) -> QuantumCircuit:qc QuantumCircuit(2…...
python实战项目65:drissionpage采集boss直聘数据
python实战项目65:drissionpage采集boss直聘数据 一、需求简介二、流程分析三、完整代码一、需求简介 boss直聘网站近期改版,改版之后代码需要做相应的升级维护。drissionpage采集网页数据是一种不错的方式,笔者认为比Selenium好用,使用方法大家可以自行查阅资料。boss直聘…...
常用的性能提升手段--提纲
上一篇文章里,介绍了提升性能的一种优化手段:池化。 这篇文章来归纳整理一下其他的常见的提升性能的手段 1. 缓存 (Caching) 缓存可以说是计算机领域的万金油了,它无处不在。 举个最简单的例子,CPU -> L1,L2,L3 Cache -> 内存 。 CPU的处理速度要比内存快几个数量…...
天梯——现代战争
第一次做的时候,直接暴力,显然最后超时。 暴力代码如下: #include<bits/stdc.h> using namespace std; const int N10005; bool mark1[N]{0},mark2[N]{0}; int p[N][N]; int main(){int n,m,k,a,b;cin>>n>>m>>k;fo…...
Codeforces Round 1021 (Div. 2) D. Baggage Claim(建图)
每周五篇博客:(4/5) https://codeforces.com/contest/2098/problem/D 题意 每个机场都有一个行李索赔区,巴尔贝索沃机场也不例外。在某个时候,Sheremetyevo的一位管理员提出了一个不寻常的想法:将行李索…...
常用第三方库:shared_preferences数据持久化
常用第三方库:shared_preferences数据持久化 前言 shared_preferences是Flutter中最常用的轻量级数据持久化解决方案,它提供了一个简单的key-value存储机制,适合存储用户配置、应用设置等小型数据。本文将从实战角度深入讲解shared_prefere…...
项目驱动 CAN-bus现场总线基础教程》随笔
阅读:《项目驱动 CAN-bus现场总线基础教程》 仲裁段的实现 有感而发 感觉出人意外之处 感觉出人意外之处 最近在阅读入门的CAN相关书籍时,在介绍仲裁段是如何实现各节点之间,通讯仲裁功能的章节中,有如下一段描述: …...
WPF之XAML基础
文章目录 XAML基础:深入理解WPF和UWP应用开发的核心语言1. XAML简介XAML与XML的关系 2. XAML语法基础元素语法属性语法集合语法附加属性 3. XAML命名空间命名空间映射关系 4. XAML标记扩展静态资源引用数据绑定相对资源引用常见标记扩展对比 5. XAML与代码的关系XAM…...
测试基础笔记第十四天
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、字符串1.字符串2.字符串切片3.查找find()4.去除两端空白字符 strip5.字符串转换大小写 lower、upper5.拆分 split()6.字符串的其他常见方…...
Java详解LeetCode 热题 100(01):LeetCode 1. 两数之和(Two Sum)详解
文章目录 1. 题目描述2. 理解题目3. 解法一:暴力枚举法3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 适用场景 4. 解法二:哈希表法4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 适用场景 5. 解法三:两遍哈希表法5.1 思…...
机器学习之三:归纳学习
正如人们有各种各样的学习方法一样,机器学习也有多种学习方法。若按学习时所用的方法进行分类,则机器学习可分为机械式学习、指导式学习、示例学习、类比学习、解释学习等。这是温斯顿在1977年提出的一种分类方法。 有关机器学习的基本概念,…...
AI声像融合守护幼儿安全——打骂/异常声音报警系统的智慧防护
幼儿园是孩子们快乐成长的摇篮,但打骂、哭闹或尖叫等异常事件可能打破这份宁静,威胁幼儿的身心安全。打骂/异常声音报警系统,依托尖端的AI声像融合技术,结合语音识别、情绪分析与视频行为检测,为幼儿园筑起一道智能安全…...
2024ICPC网络赛第二场题解
文章目录 F. Tourist(签到)I. Strange Binary(思维)J. Stacking of Goods(思维)A. Gambling on Choosing Regionals(签到)G. Game(数学)L. 502 Bad Gateway(数学)E. Escape(BFS)C. Prefix of Suffixes(kmp结论)K. match(01trie分治多项式乘法组合数) 题目链接 F. Tourist(签到…...
风控策略引擎架构设计全解析:构建智能实时决策系统
摘要 本文深入探讨现代风控策略引擎的核心架构设计,结合金融反欺诈、电商交易风控等典型场景,详细解析实时决策、规则引擎、特征计算等关键技术模块的实现方案。通过分层架构设计、分布式计算优化、策略动态编排等创新方法,展示如何构建支撑每秒万级决策的高可用风控系统。…...
TensorFlow 安装全攻略
选择 TensorFlow 的原因: TensorFlow 是一个端到端平台,它提供多个抽象级别,因此您可以根据自己的需求选择合适的级别。您可以使用高阶 Keras API 构建和训练模型,该 API 让您能够轻松地开始使用 TensorFlow 和机器学习。如果您需…...
Dijkstra 算法代码步骤[leetcode.743网络延迟时间]
有 n 个网络节点,标记为 1 到 n。 给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。 现在,…...
Ubuntu22.04/24.04 P104-100 安装驱动和 CUDA Toolkit
硬件环境 使用一块技嘉 B85m-DS3H 安装 P104-100, CPU是带集成显卡的i5-4690. 先在BIOS中设置好显示设备优先使用集成显卡(IGX). 然后安装P104-100开机. 登入Ubuntu 后查看硬件信息, 检查P104-100是否已经被检测到 # PCI设备 lspci -v | grep -i nvidia lspci | grep NVIDIA …...
Golang 学习指南
目录 变量与常量数据类型与控制结构常用数据结构函数与错误处理指针与并发Gin 框架与 go mod小结与参考资料 1. 变量与常量 变量(var) 用于定义可变的值。可以指定类型,也可以自动推断类型。示例:var name string "Golang…...
Ubuntu 磁盘空间占用清理(宝塔)
目录 前言1. 基本知识2. 实战 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 本身自搭建了一个宝塔,突然一下子多了好些空…...
AntBio: 2025 AACR Meeting - Charting New Oncology Frontiers Together
AntBio cordially invites you to attend the 2025 AACR Annual Meeting and jointly chart a new course in oncology research! The global benchmark for cancer research and therapeutics—the 2025 American Association for Cancer Research (AACR) Annual Meeting—wi…...
数模学习:二,MATLAB的基本语法使用
注释代码: (1)在每行语句后面加上分号,则不显示该行代码的运算结果。 在每行代码前加%,则该行代码会被注释掉 (2) 多行注释: 选中要注释的多行语句,按快捷键Ctrl R (3) 取消注释: 选中要注释的多行语句…...
【Webpack \ Vite】多环境配置
环境变量脚本命令 如何通过不同的环境变量或不同的配置文件进行项目区分,动态加载配置。通常,使用环境变量是最简单且灵活的方法,因为它不需要改变构建命令或创建多个配置文件 环境变量 在根目录下创建 .env.xxx 文件,为不同的环…...
已知漏洞打补丁
. 打补丁 根据MS漏洞编号或者CVE漏洞编号都可以找到对应的HotfixID。 1.根据MS漏洞编号可以使用:https://learn.microsoft.com/zh-cn/security-updates/securitybulletins/securitybulletins 即可找到KB编号。 2.根据CVE漏洞编号可以使用:https://cve…...
WGS84(GPS)、火星坐标系(GCJ02)、百度地图(BD09)坐标系转换Java代码
在做基于百度地图、高德地图等电子地图做为地图服务的二次开发时,通常需要将具有WGS84等坐标的矢量数据(如行政区划、地名、河流、道路等GIS地理空间数据)添加到地图上面。 然而,在线地图大多使用的是火星坐标系,需要…...
R语言操作n
1.加载安装vegan包 2.查看data(varechem)和data(varespec),探索其维度和结构 3.基于varespec构建物种互作网络,输出gml文件并采用gephi可视化为图片,输出pdf,阈值为r>0.6,p<0.05 4.基于varespec和varechem构建物种-环境互作…...
ChatGPT与DeepSeek在科研论文撰写中的整体科研流程与案例解析
随着人工智能技术的快速发展,大语言模型如ChatGPT和DeepSeek在科研领域展现出强大的潜力,尤其是在论文撰写方面。本文旨在介绍如何利用ChatGPT和DeepSeek提升科研论文撰写的效率与质量,并提供一个具体案例,详细阐述其技术流程及公…...
VScode在 Markdown 编辑器中预览
1. 使用在线 Mermaid 编辑器 步骤: 打开 Mermaid Live Editor。将你 .md 文件中的 Mermaid 代码(从 mermaid 到结束的代码块)复制粘贴到编辑器的左侧输入框。编辑器会自动在右侧生成可视化的 ER 图。你可以点击右上角的下载按钮,…...
驱动开发硬核特训 · Day 22(下篇): # 深入理解 Power-domain 框架:概念、功能与完整代码剖析
一、Power-domain 框架基础概念 ✏️ 什么是 Power-domain? 在 Linux 内核中,Power-domain(电源域) 是指一组硬件模块的逻辑集合,这些模块可以被统一控制电源状态(上电、断电)。 Linux 内核通…...
无人机超声波避障技术要点与难点!
一、超声波避障技术要点 4. 障碍物建模 通过最小二乘法平面拟合,将单点测距数据转化为障碍物表面模型,提高避障准确性。 使用队列(wallqueue)存储障碍物信息,并进行去重处理,避免重复避障。 5. 避障轨…...
ASCII字符编码标准及字符表
目录 概述 1 标准 ASCII 表(0-127) 2 大写字母(A-Z) 3 小写字母(a-z) 4 说明 概述 ASCII(American Standard Code for Information Interchange,美国信息交换标准代码ÿ…...
联想昭阳笔记本 风扇一键静音优化操作指南
【联想昭阳笔记本 一键静音优化操作指南】 第1步:安装官方工具 Lenovo Vantage 打开【开始菜单】→ 搜索【Microsoft Store】,打开。在 Store 里搜索【Lenovo Vantage】,下载安装。安装好后,打开【Lenovo Vantage】。进入【设备…...
go语言八股文(三)
1.java和go的区别 1. 语言设计目标 Java: 通用性:设计为一种通用的、面向对象的编程语言,适用于多种应用场景,如桌面应用、服务器端应用、移动应用等。跨平台性:通过“一次编写,到处运行”(Wr…...
Flutter 学习之旅 之 flutter 有时候部分手机【TextField】无法唤起【输入法软键盘】的一些简单整理
Flutter 学习之旅 之 flutter 有时候部分手机【TextField】无法唤起【输入法软键盘】的一些简单整理 目录 Flutter 学习之旅 之 flutter 有时候部分手机【TextField】无法唤起【输入法软键盘】的一些简单整理 一、简单介绍 二、现象描述 三、尝试的解决方案 1、根据应用的…...
【工具】scMultiMap基于单细胞多模态数据实现增强子与靶基因的细胞类型特异性映射
文章目录 介绍代码参考 介绍 在与疾病相关的细胞类型中绘制增强子和靶基因图谱,能够为全基因组关联研究(GWAS)变异的功能机制提供关键见解。单细胞多模态数据能够测量同一细胞中的基因表达和染色质可及性,从而实现细胞类型特异性…...
rt-linux下的cgroup cpu的死锁bug
一、背景 rt-linux系统有其非常大的实时性的优势,但是与之俱来的是该系统上有一些天然的缺陷。由于rt-linux系统允许进程在内核态执行的逻辑里,在持锁期间,甚至持spinlock锁期间,都能被其他进程抢占。这一特性能带来实时性的好处…...
Java 内存泄漏 详解
Java 内存泄漏是指程序中某些对象不再被使用,但由于某些原因无法被垃圾回收器(Garbage Collector, GC)回收,导致内存被持续占用,最终可能引发性能问题或 OutOfMemoryError。 本文将从底层原理、源码层面详细解释 Java …...
Rabbit MQ的基础认识
零、介绍 MQ:message queue(消息队列:先进先出) Rabbit MQ: 一、优势 1.应用解耦 2.异步提速 3.削峰填谷 4.总结 二、劣势...
GIS开发笔记(16)解决基于osg和osgearth三维地图上添加placeNode图标点击不易拾取的问题
一、实现效果 二、实现原理 在图标添加的位置同时添加一个红色圆球,半径为5000~8000米,图标和圆球挂接到同一个group节点,group节点再挂接到根节点,当点击到圆球时,通过遍历父节点就可以找到被点击的图标节点。 三、参考代码 //添加图标代码 #pragma once #include &…...
JDBC 使用流程详解
1. 加载数据库驱动 目的:注册数据库驱动类,使 JDBC 能识别特定数据库(如 MySQL、Oracle)。 代码示例: // JDBC 4.0 后无需显式加载驱动(SPI 自动发现),但部分旧项目仍需手动加载 C…...
小白学习java第16天(上): javaWeb
0.背景介绍 1.前言 首先我们需要javaweb里面的大概流程是干什么的,怎么才能实现的?,每一部分是靠什么进行的?以及背后实现的功能是干什么的?。。。。对于我来说要是不解决这些,会让我感觉不踏实ÿ…...
vue 打包设置
1、vue webpack配置 filename: [path][base].gz,// 设置成这样就行了 const { defineConfig } require(vue/cli-service)const debug process.env.NODE_ENV ! productionconst CompressionWebpackPlugin require(compression-webpack-plugin)const TerserPlugin require(…...
Excel如何安装使用EPM插件并且汉化?
Excel如何使用EPM插件 Excel如何使用EPM插件一、安装EPM插件二、启动EPM插件三、插件汉化设置 Excel如何使用EPM插件 一、安装EPM插件 在安装EPM插件时,若运行安装包后出现报错提示,通常是因为系统缺少 Visual Studio 2010 组件,需先安装该…...
在Linux中使用fcntl函数和ioctl函数
特性fcntlioctl作用对象文件描述符(通用文件操作)设备文件(硬件或驱动控制)标准化程度POSIX 标准,行为一致设备相关,无统一标准典型场景文件锁、非阻塞模式、描述符复制终端控制、网络配置、硬件操作移植性…...