LeetCode题练习与总结:字母异位词分组

一、题目描述

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

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

示例 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] 仅包含小写字母

二、解题思路

  1. 理解问题:我们需要将一组字符串按照字母异位词进行分组。字母异位词指的是字母的排列不同,但是字母的种类和数量完全相同。

  2. 创建映射:我们可以使用一个Map来存储每个字符串与其对应的异位词列表。Map的键是一个字符串,表示一个字符串数组,这个数组中的每个元素都是原字符串的一个异位词。Map的值是一个List,存储所有异位词。

  3. 处理字符串:对于输入数组中的每个字符串,我们需要进行排序,以便将相同的字母异位词放在一起。例如,"eat"、"tea"和"ate"排序后都变成"aet"。

  4. 填充映射:将排序后的字符串作为Map的键,将原始字符串添加到对应的List中。

  5. 返回结果:最后,我们需要遍历Map的值,将所有的List收集到一个List中,并返回这个List。

三、具体代码

import java.util.*;public class Solution {public List<List<String>> groupAnagrams(String[] strs) {// 创建一个Map来存储排序后的字符串和对应的异位词列表Map<String, List<String>> map = new HashMap<>();// 遍历所有的字符串for (String str : strs) {// 对字符串进行排序,以便将异位词放在一起char[] charArray = str.toCharArray();Arrays.sort(charArray);String sortedStr = new String(charArray);// 将排序后的字符串作为键,原始字符串添加到对应的List中map.computeIfAbsent(sortedStr, k -> new ArrayList<>()).add(str);}// 收集所有的异位词列表List<List<String>> result = new ArrayList<>();result.addAll(map.values());return result;}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 对于每个字符串,我们都需要进行一次排序操作。字符串排序的时间复杂度是 O(n log n),其中 n 是字符串的长度。由于字符串的最大长度为 100,这个操作对整个算法的影响较小。
  • 我们还需要遍历所有的字符串,这个操作的时间复杂度是 O(m),其中 m 是字符串数组的长度。
  • Map 的 computeIfAbsent 方法在大多数情况下是 O(1),但在最坏情况下(例如当Map的负载因子达到一定阈值时需要扩容)可能会达到 O(n)。
  • 最后,我们将Map中的所有List添加到结果List中,这个操作的时间复杂度是 O(k),其中 k 是Map中元素的数量。
  • 综上所述,总的时间复杂度是 O(m * n log n + m * n + k)。由于 m 和 n 都可能非常大,我们可以简化为 O(m * n log n),这是因为排序操作通常比其他操作更耗时。
2. 空间复杂度
  • Map 存储了每个排序后的字符串及其对应的原始字符串列表。在最坏的情况下,每个字符串都是唯一的异位词,这意味着 Map 中将有 m 个键值对,每个键值对占用 O(n) 的空间来存储原始字符串列表。
  • 结果List 存储了所有的异位词列表,其空间复杂度为 O(k)。
  • 因此,总的空间复杂度是 O(m * n + k),其中 m 是字符串数组的长度,n 是字符串的平均长度,k 是Map中元素的数量。在最坏的情况下,k 可能等于 m,因此空间复杂度可以简化为 O(m * n)。

五、总结知识点

1. Java集合框架(Collections Framework):

  • HashMap: 一个基于键值对的数据结构,允许使用一个对象作为键来存储和检索另一个对象。在这个例子中,HashMap用于存储排序后的字符串作为键,以及对应的原始字符串列表作为值。
  • ArrayList: 一个动态数组的实现,用于存储有序集合中的元素。在这个例子中,ArrayList用作HashMap的值,来存储具有相同排序字符串的原始字符串列表。

2. 字符串操作:

  • toCharArray(): 这个方法将字符串转换为字符数组。
  • Arrays.sort(): 这是一个静态方法,用于对数组进行排序。在这个例子中,它被用来对字符串中的字符进行排序,以便将异位词分组。
  • new String(charArray): 这个构造函数用于从字符数组创建一个新的字符串。

3. Map操作:

  • computeIfAbsent(): 这是一个Map接口中的方法,用于在Map中查找一个键对应的值。如果键不存在,它会使用提供的函数来计算值,并将其放入Map中。这个方法在这个例子中用于创建新的ArrayList(如果还没有为排序后的字符串创建过),然后将原始字符串添加到这个列表中。

4. 排序算法:

  • 代码中使用了Java的内置排序方法(由Arrays.sort()提供),这是一种基于归并排序的算法,其时间复杂度通常为O(n log n)。

5. List操作:

  • addAll(): 这是一个List接口中的方法,用于将一个集合中的所有元素添加到另一个集合中。在这个例子中,它被用来将Map中的所有异位词列表添加到结果List中。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

rabbitMQ的基础操作与可视化界面

当你安装好RabbitMq时&#xff0c;可以 尝试一下&#xff0c;这些命令 启动rabbitMQ服务 #启动服务 systemctl start rabbitmq-server #查看服务状态 systemctl status rabbitmq-server #停止服务 systemctl stop rabbitmq-server #开机启动服务 systemctl enable rabbitmq-…

2024.3.30每日一题

LeetCode 需要添加的硬币的最小数量 题目链接&#xff1a;2952. 需要添加的硬币的最小数量 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个下标从 0 开始的整数数组 coins&#xff0c;表示可用的硬币的面值&#xff0c;以及一个整数 target 。 如果存在某个 c…

在Arduino IDE中使用文件夹组织源文件和头文件

在Arduino IDE中使用文件夹组织源文件和头文件 如果你是一名Arduino爱好者&#xff0c;你可能会发现随着项目的复杂度增加&#xff0c;代码的管理变得越来越困难。在Arduino IDE中&#xff0c;你可以通过使用文件夹来更好地组织你的源文件和头文件&#xff0c;使得代码更加清晰…

深度学习导论

具有非常详尽的数学推导过程 概述 定位 比较传统机器学习深度学习特征人工定义机器生成模型决策树、SVM、贝叶斯等&#xff08;具有不同数学原理&#xff09;神经网络 概率论 联合概率 P ( X , Y ) P ( X ∣ Y ) P ( Y ) P ( Y ∣ X ) P ( X ) P(X,Y)P(X|Y)P(Y)P(Y|X)P(X…

flutter 自定义弹窗封装弹窗----在弹窗内实现部分窗体生命周期

小部件组件 可以在里面加装其他事件如HTTP接口访问 import package:flutter/material.dart;///执行弹窗动画封装 class ExecutionDialog extends StatefulWidget {// final String? title;// final String? message;// final Function? onExecute;//// const ExecutionDial…

暴力枚举--选数

题目描述 已知 n 个整数 x1​,x2​,⋯,xn​&#xff0c;以及 1 个整数 k&#xff08;k<n&#xff09;。从 n 个整数中任选 k 个整数相加&#xff0c;可分别得到一系列的和。例如当 n4&#xff0c;k3&#xff0c;4 个整数分别为 3,7,12,19 时&#xff0c;可得全部的组合与它…

关于Docker守护程序未运行导致的错误

01 在启动Docker之前&#xff0c;确保你已经安装了Docker并且Docker服务是运行的。以下是一些步骤可以帮助你解决这个问题&#xff1a; 首先&#xff0c;确保Docker已经正确安装在你的系统上。你可以通过运行以下命令来检查Docker是否已安装&#xff1a; docker --version如果…

【免费获取】【下片神器】IDM非主流网站视频免费下载神器IDM+m3u8并解决idm下载失败问题 idm下载器超长免费试用

当你浏览一个网站&#xff0c;看到一个喜欢的视频&#xff0c;不知道如何下载的时候&#xff0c;本教程或许可以帮你点小忙。大部分的主流网站都有专门的下载工具&#xff0c;本篇教程主要针对的是一些非主流的小网站。 我们的下载方法就是利用IDM&#xff08;Internet Downlo…

web练习仿小米页面

效果图&#xff1a; HTML代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document…

江苏开放大学2024年春《液压与气压传动060246》第2形考作业占形考成绩的25%参考答案

​答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 电大搜题 多的用不完的题库&#xff0c;支持文字、图片搜题&…

python--冒泡排序和main函数

1.判断是不是回文数&#xff1a; x int(input("请输入一个正整数&#xff1a;")) x str(x) if x x[::-1]:print("是回文数。") else:print("不是回文数。") 2.冒泡排序 # 冒泡排序: # [30&#xff0c;8&#xff0c;-10&#xff0c; 50&am…

[OAuth2]authorization_request_not_found

最近在写一套OAuth2s授权认证&#xff0c;当在oauth2-client调用oauth2-server&#xff0c;并且在点击授权以后&#xff0c;oauth2-client却显示【authorization_request_not_found】&#xff0c;并跳到了登陆页面。 经过调试发现&#xff0c;【authorization_request_not_fou…

Java希尔排序知识点(含面试大厂题和源码)

希尔排序&#xff08;Shell Sort&#xff09;是插入排序的一种改进版本&#xff0c;也被称为“缩小增量排序”。它是由IBM的研究员Donald Shell于1959年提出的。希尔排序的核心思想是将原始数据集分割成若干个子序列&#xff0c;每个子序列由相隔一定增量的元素组成&#xff0c…

[LeetCode][400]第 N 位数字

题目 400. 第 N 位数字 给你一个整数 n &#xff0c;请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …] 中找出并返回第 n 位上的数字。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;n 11 输出&#xff1a;…

java算法汇总(蓝桥常用-->自总版)(更新中...)

这里写目录标题 1.递归求n的阶乘2.互质3.例题:奇妙的数字两个数字拼接String.toCharArray()方法String.valueOf()方法 4.例题:美丽的2String.contains()方法 5.ASCII码---a,A,0的转换6.String[] a---->求sum(a[p].charAt(q))-0;7.复数BigInteger 大整数类型本题用到的方法--…

Sora是否能颠覆视频制作行业?一文带你了解

一个月前OpenAI宣布了一款名为Sora的新生成式人工智能系统&#xff0c;该系统可以根据文本提示生成短视频。虽然Sora尚未向公众开放&#xff0c;但迄今为止发布的高质量样本已经引起了兴奋和担忧的反应。 OpenAI发布的样本视频&#xff08;该公司称这些视频是由Sora直接制作&am…

Python学习笔记-简单案例实现多进程与多线程

Python 的多进程与多线程是并发编程的两种重要方式&#xff0c;用于提高程序的执行效率。它们各自有不同的特点和适用场景。 多进程&#xff08;Multiprocessing&#xff09; 概念&#xff1a; 多进程是指操作系统中同时运行多个程序实例&#xff0c;每个实例称为一个进程。…

表单元素使用

表单元素使用 要完成的效果:代码实现: 要完成的效果: 代码实现: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

完整部署一套k8s-v.1.28.0版本的集群

一、系统情况 虚拟机版本&#xff1a;esxi 6.7 系统版本&#xff1a;centos7.9_2009_x86 配置&#xff1a;4核8G&#xff08;官网最低要求2核2G&#xff09; 192.168.0.137 master节点 192.168.0.139 node2节点 192.168.0.138 node1节点&#xff08;节点扩容练习&#xf…

Spring Cloud_Spring Cloud Alibaba_00000

版本选择 Spring Boot版本选择 Spring Boot github源码地址&#xff1a;https://github.com/spring-projects/spring-boot/releases/ Spring Boot github地址&#xff1a;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes Spring Cloud g…