力扣最热一百题——2.字母异位词分组

目录

题目链接:49. 字母异位词分组 - 力扣(LeetCode)

题目

示例

提示

解法一:哈希表+排序

思路

代码实现

解法二:记录字母出现的次数+哈希表

思路

代码实现

总结


 

        话不多说直接上题目。 


题目链接:49. 字母异位词分组 - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

        说实话刚刚看到这个题目的时候心中有很多想法,但好像都不是很容易实现,那其实作为力扣的一道中等题,还是存在些许的难度的,我们来看看具体怎么解决它吧。

题目

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

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

示例

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

解法一:哈希表+排序

思路

        我们的目标是对给定字符串数组中的异位词进行分组的。第一种解法的思路如下。

        首先定义一个结果容器res,用来存放分组后的结果。然后定义一个哈希表map作为哈希表,其中每个键是按照字母顺序排序后的字符串,对应的值是该异位词的全部字符串。

        接下来,代码通过遍历给定的字符串数组strs,对每个字符串进行处理。首先将字符串转换为字符数组chars,然后对字符数组进行排序,得到按照字母顺序排序后的字符串s。然后从map中取出以s为键的值,如果不存在则使用默认值new ArrayList<String>()创建一个空的ArrayList。然后将当前的字符串str加入到该ArrayList中,并将更新后的ArrayList再次放入map中。这样就完成了将同一组异位词存放在同一个键下的操作。

        最后,通过调用map的values()方法获取所有值的集合,并使用ArrayList的构造函数将其转换为ArrayList返回即可。

        其实还是非常的简单的。

代码实现

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        // 定义出返回的list容器
        List<List<String>> res = new ArrayList<>();
        // 定义map集合作为哈希表,排序后的字符串作为key,该异位词的全部作为value
        Map<String, ArrayList<String>> map = new HashMap<>();

        // 遍历挨个取出数组中的字符串
        for (String str : strs) {
            // 将字符串转换为字符数组便于将字母排序
            char[] chars = str.toCharArray();
            // 排序
            Arrays.sort(chars);
            String s = new String(chars);
            // 加入进value
            ArrayList<String> orDefault = map.getOrDefault(s, new ArrayList<String>());
            orDefault.add(str);
            map.put(s, orDefault);
        }
        return new ArrayList<>(map.values());
    }
}

        注意:这里不能直接使用排序后的字符数组来作为key,因为直接使用字符数组是使用的地址,会导致即使是一样的字符数组也会是不同的哈希值,所以不可以让字符数组作为key。


解法二:记录字母出现的次数+哈希表

思路

        我们的目的是将给定字符串数组中的异位词进行分组的。与之前的代码相比,这里使用了记录字母出现次数加哈希表的方法。

        首先定义一个哈希表map,其中每个键是按照字母出现次数和顺序拼接后的字符串,对应的值是该异位词的全部字符串。

        然后,遍历给定的字符串数组strs,对每个字符串进行处理。首先定义一个长度为26的整型数组counts,用来统计每个字母出现的次数。然后遍历字符串的每个字符,根据字符与字母'a'的差值来确定在counts数组中的位置,并将对应位置的计数值加1。

        接下来,使用StringBuffer对出现次数大于0的字母和对应的出现次数进行拼接,得到按顺序拼接后的字符串sbuf,作为哈希表的键。然后从map中取出以sbuf为键的值,如果不存在则使用默认值new ArrayList<>()创建一个空的ArrayList。然后将当前的字符串str加入到该ArrayList中,并将更新后的ArrayList再次放入map中。这样就完成了将同一组异位词存放在同一个键下的操作。

        最后,通过调用map的values()方法获取所有值的集合,并使用ArrayList的构造函数将其转换为ArrayList返回即可。

代码实现

public class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        // 这次采用记录出现字母的次数加哈希表的方法
        Map<String, List<String>> map = new HashMap<>();
        // 遍历取出每个字符串
        for (String str : strs) {
            // 定义一个长度为26的整形数组,0代表a,1代表b以此类推
            int[] counts = new int[26];
            // 统计字母出现的次数
            int length = str.length();
            for (int i = 0; i < length; i++) {
                counts[str.charAt(i) - 'a']++;
            }
            // 将每个出现次数大于 0 的字母和出现次数按顺序拼接成字符串,作为哈希表的key
            // 采用StringBuffer进行拼接
            StringBuffer sbuf = new StringBuffer();
            for (int i = 0; i < 26; i++) {
                if (counts[i] != 0) {
                    // 这里是将对应的字母和出现次数直接拼接了,而不是出现多少次拼接多少次
                    sbuf.append((char) ('a' + i));
                    sbuf.append(counts[i]);
                }
            }
            // 转换为字符串作为key
            String key = new String(sbuf);
            List<String> list = map.getOrDefault(key, new ArrayList<>());
            list.add(str);
            map.put(key, list);
        }
        return new ArrayList<>(map.values());
    }
}

注意: 

                    sbuf.append((char) ('a' + i));
                    sbuf.append(counts[i]);

这两行代码是用来将出现次数大于0的字母和对应的出现次数拼接成一个字符串sbuf。

  • sbuf.append((char) ('a' + i)): 这行代码将当前字母的ASCII码转换为对应的字符,并将其追加到sbuf中。因为字母'a'对应的ASCII码是97,所以通过('a' + i)可以得到对应的字母。
  • sbuf.append(counts[i]): 这行代码将counts数组中当前字母的出现次数追加到sbuf中,以便形成完整的拼接字符串。

也就是说:这里是将对应的字母和出现次数直接拼接了,而不是出现多少次拼接多少次

        因为多了很多需要遍历操作还开了很多内存,所以执行速度和内存消耗都有点不尽人意,记住第一种方法就好。


总结

        其实还是挺EZ的,哈希表的题目都挺简单的,就是存和找的过程罢了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring MVC 简单案例(3)我的书架管理系统

一、创建项目 最后修改以下 spring 版本 为 2.7.17 Java 版本为 8 同时在 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…

[Python库](3) Arrow库

目录 1.简介 2.安装 3.函数 3.1.获取当前UTC时间( 世界协调时时间 ) 3.2.格式化日期 3.3.创建Arrow对象 3.4.时间改变 3.5.获取时间戳 3.6.时区改变 4.小结 1.简介 Arrow库是一个Python库&#xff0c;提供了一套用于处理日期和时间的API。Arrow库特别适合在需要进行大…

【算法专题】双指针算法之611. 有效三角形的个数(力扣)

欢迎来到CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a;双指针算法之611. 有效三角形的个数&#xff08;力扣&#xff09; &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Li…

web安全之跨站脚本攻击xss

定义: 后果 比如黑客可以通过恶意代码,拿到用户的cookie就可以去登陆了 分类 存储型 攻击者把恶意脚本存储在目标网站的数据库中(没有过滤直接保存)&#xff0c;当用户访问这个页面时&#xff0c;恶意脚本会从数据库中被读取并在用户浏览器中执行。比如在那些允许用户评论的…

Android APP 基于RecyclerView框架工程(知识体系积累)

说明&#xff1a;这个简单的基于RecyclerView的框架作用在于自己可以将平时积累的一些有效demo整合起来&#xff08;比如音视频编解码的、opengles的以及其他也去方向的、随着项目增多&#xff0c;工程量的增加&#xff0c;后期想高效的分析和查找并不容易&#xff09;&#xf…

java题目之评委打分

public class Main5 {public static void main(String[] args) {//在唱歌比赛中&#xff0c;有6名评委打分&#xff0c;分数范围是[0-100]之间的整数//选手的最后得分为&#xff1a;去掉最高分&#xff0c;最低分后的4个评委的平均分&#xff0c;请完成上述过程中并计算选手的得…

python实现责任链模式

把多个处理方法串成一个list。下一个list的节点是上一个list的属性。 每个节点都有判断是否能处理当前数据的方法。能处理&#xff0c;则直接处理&#xff0c;不能处理则调用下一个节点&#xff08;也就是当前节点的属性&#xff09;来进行处理。 Python 实现责任链模式&#…

若依前后端获取当前用户

后端 Autowired private TokenService tokenService;LoginUser loginUser tokenService.getLoginUser(); sysInquiry.setCreateBy(loginUser.getUsername()); sysInquiry.setCreateTime(DateUtils.getNowDate()); 前端 获取使用 const nickName this.$store.state.user.nick…

为什么有网工刚毕业工资就特别高?

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 你们好&#xff0c;我的网工朋友。 不知道你有没有发现这样一个现象&#xff1a; 有的老兄工作了十几年&#xff0c;还是个基层员工&#xff0c…

【深度学习入门篇 ⑧】关于卷积神经网络

【&#x1f34a;易编橙&#xff1a;一个帮助编程小伙伴少走弯路的终身成长社群&#x1f34a;】 大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; ) &#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官…

多租户分库分表同步数据库DDL脚本

我们在实现多租户系统的时候&#xff0c;为了数据安全和性能&#xff0c;往往会把数据库设计成一个租户一个数据库&#xff0c;如下图,主库记录了租户信息和对应的数据库地址&#xff0c;租户数据库则存储了租户相关的数据,租户数据库的表结构都是一致的&#xff0c;这种方式有…

npm 安装报错(已解决)+ 运行 “wue-cli-service”不是内部或外部命令,也不是可运行的程序(已解决)

首先先说一下我这个项目是3年前的一个项目了&#xff0c;中间也是经过了多个人的修改惨咋了布置多少个人的思想&#xff0c;这这道我手里直接npm都安装不上&#xff0c;在网上也查询了多种方法&#xff0c;终于是找到问题所在了 问题1&#xff1a; 先是npm i 报错在下面图片&…

全新AI工具——PaintsUndo:一键自动还原图像绘画过程!

ControlNet 作者 Lvmin Zhang 又开始整活了&#xff01;这次发布的PaintsUndo 只需要上传一张图片&#xff0c; 就能够一键生成绘画过程&#xff01;快来了解学习&#xff01; 1、核心技术 PaintsUndo 是一项突破性的技术&#xff0c;旨在通过输入静态图像&#xff0c;自动生…

SpringCloudAlibaba-Seata2.0.0与Nacos2.2.1

一、下载 ## 下载seata wget https://github.com/apache/incubator-seata/releases/download/v2.0.0/seata-server-2.0.0.tar.gz## 解压 tar zxvf seata-server-2.0.0.tar.gz二、执行sql文件 ## 取出sql文件执行 cd /seata/script/server/db/mysql ## 找个mysql数据库执行三、…

分布式服务框架zookeeper+消息队列kafka

一、zookeeper概述 zookeeper是一个分布式服务框架&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题&#xff0c;如&#xff1a;命名服务&#xff0c;状态同步&#xff0c;配置中心&#xff0c;集群管理等。 在分布式环境下&#xff0c;经常需要对应用/服…

钡铼分布式I/O系统边缘计算Modbus,MQTT,OPC UA耦合器BL206

BL206系列耦合器是一个数据采集和控制系统&#xff0c;基于强大的32 位微处理器设计&#xff0c;采用Linux操作系统&#xff0c;支持Modbus&#xff0c;MQTT&#xff0c;OPC UA协议&#xff0c;可以快速接入现场PLC、DCS、PAS、MES、Ignition和SCADA以及ERP系统&#xff0c;同时…

numpy(史上最全)

目录 numpy简介 性能对比 ndarray属性 numpy中的数组&#xff1a; 几个创建的函数&#xff1a; 1) np.ones(shape, dtypeNone, orderC) shape: 形状&#xff0c;使用元组表示 2) np.zeros(shape, dtypefloat, orderC) 3) np.full(shape, fill_value, dtypeNone, orderC)…

核函数支持向量机(Kernel SVM)

核函数支持向量机&#xff08;Kernel SVM&#xff09;是一种非常强大的分类器&#xff0c;能够在非线性数据集上实现良好的分类效果。以下是关于核函数支持向量机的详细数学模型理论知识推导、实施步骤与参数解读&#xff0c;以及两个多维数据实例&#xff08;一个未优化模型&a…

IVI(In-Vehicle Infotainment,智能座舱的信息娱乐系统)

IVI能够实现包括三维导航、实时路况、辅助驾驶等在线娱乐功能。 IVI人机交互形式&#xff08;三板斧&#xff09;&#xff1a;声音、图像、文字 IVI人机交互媒介I&#xff08;四件套&#xff09;&#xff1a;中控屏幕&#xff08;显示、触控&#xff09;、仪表显示、语言、方…

吴恩达大模型系列课程《Prompt Compression and Query Optimization》中文学习打开方式

Prompt Compression and Query Optimization GPT-4o详细中文注释的Colab观看视频1 浏览器下载插件2 打开官方视频 GPT-4o详细中文注释的Colab 中文注释链接&#xff1a;https://github.com/Czi24/Awesome-MLLM-LLM-Colab/tree/master/Courses/1_Prompt-Compression-and-Query-…