LeetCode算法题:49. 字母异位词分组(Java)

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

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

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

我的解题思路:
自定义一个hash方法,将每个字符串进行hash计算,将相同hash值的字符串存放在一个list当中。
我定义的hash方法:每个字符的转为int值,然后相乘,乘积对他们的和+1取余数。

出现错误:
在这里插入图片描述
原因:上述hash方法存在碰撞,没有有效处理碰撞的情况。
试了好几次自定义的hash方法,一直都是存在碰撞的情况。
不死磕,直接看官方题解:
官方题解1:
方法一:排序
由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<String, List<String>>();
        for (String str : strs) {
            char[] array = str.toCharArray();
            Arrays.sort(array);
            String key = new String(array);
            List<String> list = map.getOrDefault(key, new ArrayList<String>());
            list.add(str);
            map.put(key, list);
        }
        return new ArrayList<List<String>>(map.values());
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/group-anagrams/solutions/520469/zi-mu-yi-wei-ci-fen-zu-by-leetcode-solut-gyoc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

方法2:
方法二:计数
由于互为字母异位词的两个字符串包含的字母相同,因此两个字符串中的相同字母出现的次数一定是相同的,故可以将每个字母出现的次数使用字符串表示,作为哈希表的键。

由于字符串只包含小写字母,因此对于每个字符串,可以使用长度为 26的数组记录每个字母出现的次数。需要注意的是,在使用数组作为哈希表的键时,不同语言的支持程度不同,因此不同语言的实现方式也不同。

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> map = new HashMap<String, List<String>>();
        for (String str : strs) {
            int[] counts = new int[26];
            int length = str.length();
            for (int i = 0; i < length; i++) {
                counts[str.charAt(i) - 'a']++;
            }
            // 将每个出现次数大于 0 的字母和出现次数按顺序拼接成字符串,作为哈希表的键
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < 26; i++) {
                if (counts[i] != 0) {
                    sb.append((char) ('a' + i));
                    sb.append(counts[i]);
                }
            }
            String key = sb.toString();
            List<String> list = map.getOrDefault(key, new ArrayList<String>());
            list.add(str);
            map.put(key, list);
        }
        return new ArrayList<List<String>>(map.values());
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/group-anagrams/solutions/520469/zi-mu-yi-wei-ci-fen-zu-by-leetcode-solut-gyoc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

自我总结:
对于hash类题目,还是尽量不要自己创建hash方法去计算hash值,你以为的独一无二的hash方法,总能被测试用力暴捶。尽量从题目描述中去找到一些独特之处作为hashmap的键。例如这一次使用排序后的字符串,或者每个字符出现的次数都可以作为键。

如何在函数方法上新建对象?
直接和新建对象一样的方法:new
在这里插入图片描述

HashMap的contain方法有哪些。
containsKey(),containsValue()

如何收集HashMap的所有value值作为一个集合返回。

new ArrayList<T>(map.values()) // T与map的value类型要统一

HashMap根据键取值的方法.

map.get(key)

List list = new List();错误的定义集合方法,因为List是一个接口,不能有实现类。

List集合修改某个位置的值

list.set(index,newValue);

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

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

相关文章

【吃透Java手写】5-RPC-简易版

【吃透Java手写】RPC-简易版-源码解析 1 RPC1.1 RPC概念1.2 常用RPC技术或框架1.3 初始工程1.3.1 Productor-common&#xff1a;HelloService1.3.2 Productor&#xff1a;HelloServiceImpl1.3.3 Consumer 2 模拟RPC2.1 Productor2.2 模拟一个RPC框架2.2.1 HttpServer2.2.2 Http…

如何安全高效地进行4S店文件分发,保护核心资产?

4S店与总部之间的文件分发是确保双方沟通顺畅、信息共享和决策支持的重要环节。4S店文件分发涉及到以下文件类型&#xff1a; 销售报告&#xff1a;4S店需要定期向总部提交销售报告&#xff0c;包括销售数量、销售额、市场份额等关键指标。 库存管理文件&#xff1a;包括车辆库…

Linux-基础IO

&#x1f30e;Linux基础IO 文章目录&#xff1a; Linux基础IO C语言中IO交互       常用C接口         fopen         fputs         fwrite         fgets 当前路径       三个文件流 系统文件IO       open函数     …

windows 环境下安装《车辆动态监控系统》支持JT808、JT1078、苏标主动安全设备接入

《车辆动态监控系统》下载安装部署包 开放端口 80/443/8800&#xff0c;web后台端口&#xff0c;nginx代理服务&#xff0c;nginx默认为8800端口8808&#xff0c;JT808专用端口6802&#xff0c;视频播放推流端口6891-6898&#xff0c;FTP端口6821&#xff0c;苏标主动安全附件…

一. Ast - 反混淆(基础篇)

目录 ​编辑 1. 什么是Ast-了解 2. 什么是反混淆-了解 3. 了解Ast结构 4. 思考 5. 前置准备 6. 什么是babel 7. 安装babel 8. ast反混淆代码基本结构 9. babel中的组件 parser与generator 组件 traverse 组件 与visitor enter与exit visitor 其他写法 traverse …

Python API和微服务的测试库之httpretty使用详解

概要 在现代软件开发中,API和微服务的测试是确保应用稳定性和功能正确性的关键环节。Python的HTTPretty库提供了一个强大的工具,允许开发者在不实际发起网络请求的情况下模拟HTTP请求和响应。本文将全面介绍HTTPretty的安装、特性、基本与高级功能,并结合实际应用场景,展示…

FebHost:什么是汤加.TO域名?

什么是.TO域名&#xff1f; 汤加域名是指在顶级域.to下注册的域名&#xff0c;.to域名是汤加的国家代码顶级域&#xff08;ccTLD&#xff09;。它类似于其他特定国家的域名后缀&#xff0c;如美国的”.us “或英国的”.uk”。 汤加国家介绍 汤加正式名称为汤加王国&#xff…

Java入门基础学习笔记19——关系运算符、逻辑运算符

关系运算符&#xff1a; 判断数据是否满足条件&#xff0c;最终会返回一个判断的结果&#xff0c;这个结果是布尔类型的值&#xff1a;true或false。 注意&#xff1a;在java中判断是否相等一定是“”&#xff0c;不要把“”写成“”&#xff0c;“”是赋值表达式。 package c…

【kubeflow文档】kubeflow介绍与架构

1. kubeflow介绍 Kubeflow项目致力于使机器学习&#xff08;ML&#xff09;工作流在Kubernetes上的部署变得简单、可移植和可扩展。目标不是重新创建其他服务&#xff0c;而是提供一种直接的方法&#xff0c;将ML的开源系统部署到不同的基础设施中。无论在哪里运行Kubernetes&a…

2.1 软件工程

第2章 信息技术知识 2.1 软件工程 现状&#xff1a; 开发软件的规模越来越大复杂度越来越高用户需求并不十分明确缺乏软件开发方法和工具方面的有效支持 软件成本日益增长、开发进度难以控制、软件质量无法保证、软件维护困难等问题日益突出。人们开始用工程的方法进行软件…

K8S -----二进制搭建 Kubernetes v1.20

目录 一、准备环境 1.1 修改主机名 1.2 关闭防火墙&#xff08;三台一起&#xff0c;这里只展示master01&#xff09; 1.3 在master添加hosts&#xff08;依旧是三台一起&#xff09; 1.4 调整内核参数并开启网桥模式 二、部署docker引擎 三、部署 etcd 集群 1.在mast…

水电站机组油压自动化控制系统概述及优势介绍

一、系统背景 我国河流、湖泊分布广泛&#xff0c;落差巨大&#xff0c;蕴藏着丰富的资源优势&#xff0c;我国作为世界第二大能源消耗国&#xff0c;对于电力的需求是巨大的&#xff0c;水力发电具有高效、清洁、能量供给稳定充足的特点&#xff0c;因此&#xff0c;水电工程…

基础ArkTS组件:数据面板组件(图表),日期选择器组件(HarmonyOS学习第三课【3.5】)

tuoz数据面板组件 DataPanel 数据面板组件&#xff0c;用于将多个数据占比情况使用占比图进行展示。 说明 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 DataPanel(options:{values: numbe…

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

基础知识要求&#xff1a; Java&#xff1a;方法、while循环、for循环 Python&#xff1a; 方法、while循环、for循环 题目&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head […

深入了解 MyBatis 插件:定制化你的持久层框架

序言 MyBatis 是一个流行的 Java 持久层框架&#xff0c;它提供了简单而强大的数据库访问功能。然而&#xff0c;有时候我们需要在 MyBatis 中添加一些自定义的功能或行为&#xff0c;来满足特定的需求。这时&#xff0c;MyBatis 插件就发挥了重要作用。本文将深入探讨 MyBati…

【C++】深度解析:用 C++ 模拟实现 String 类,探索其底层实现细节

目录 了解string类 string的内存管理 VS下string的结构 ​g下string的结构 string的模拟实现 string的构造函数 浅拷贝 深拷贝 string的遍历 重载 [] 下标访问 迭代器访问 reserve resize 增删查改 push_back() append和 insert和erase find substr swap 流插入…

一个完美的回到顶部按钮

大家好,我是 Just,这里是「设计师工作日常」,今天给大家写了一个丝滑回到顶部的按钮,原生js实现的,兼容性所有主流浏览器,可在vue中使用,适用于网页、h5等。 最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码js 部分代码完整代…

网络网络层之(5)IPv6协议

网络网络层之(5)IPv6协议 Author: Once Day Date: 2024年5月12日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day…

啥都吃的打字练习软件TL(TypeLetters)

今天给大家安利一款啥都吃的打字练习软件——TL&#xff08;TypeLetters&#xff09;。 为什么说TL啥都吃呢&#xff1f;很简单&#xff0c;因为不管是科技的、还是时事的、或者潮流的、或者热点的&#xff0c;凡是英文的资料TL都能通通吃下去&#xff0c;所以说TL是来者不拒&…

QT C++ widget layout 嵌套 例子2

在上篇文章中描述了实中套虚&#xff08;用setLayout&#xff09;&#xff0c;虚中套实&#xff08;用addWidget&#xff09;。 本文再加1条&#xff0c;虚中套虚&#xff08;用addLayout&#xff09;。 所谓虚中套虚&#xff0c;是layout 套 layout 。 另外用循环代码生成从…