【hot100】跟着小王一起刷leetcode -- 49. 字母异位词分组

【【hot100】跟着小王一起刷leetcode -- 49. 字母异位词分组

  • 49. 字母异位词分组
    • 题目解读
    • 解题思路
    • 代码实现
  • 总结

49. 字母异位词分组

题目解读

49. 字母异位词分组
在这里插入图片描述
ok,兄弟们,咱们来看看这道题,很明显哈,这里的关键词是字母异位词,这是啥意思呢?

我们读一下题目,其实就发现很简单,两个词,如果对字母重新排列之后是相同的,那么这俩就是字母异位词,举个例子哈

ate可以排列为eataet也可以重新排列为eat,那么这三个词就是字母异位词。

这个题让我们对给出的词进行分组,互为字母异位词的存放在一起,那咱们来看看咋做吧。

解题思路

看了刚才的题目介绍,想必你已经有了想法,我把这些词的字母按顺序排列下,然后把相同的放在一起不就做完了吗!

确实,这个想法是可行的,然后你采用最简单的插入排序排了一下,然后发现ac了。
在这里插入图片描述
但当你看到时间复杂度的时候,你陷入了沉思
在这里插入图片描述
这。。。。。

来看看咋改良把,很明显哈,咱们的排序肯定是浪费时间的,那考虑下怎么才能在O(n)时间完成排序呢?或则有没有其他方法可以起到和排序一样的作用呢?

很明显,O(n)时间有点困难,那怎么代替排序呢?

现在想想,无非是把这些词的字母按照顺序存放起来,那这些字母本身有没有自带这种用于排序的东西呢?

答案是有的,没错就是ascii

我们可以采用空间换时间的方法,每当遍历一个单词的时候,首先申请26个空间的数组,并且都置为0,然后根据出现的字母对应的数组值执行**+1**操作,遍历所有字母之后转换为字符串作为判断的识别符,你会发现,字母异位词对应的识别符是相同的,这样我们就在O(n)的时间里为互为字母异位词的单词设置了相同的识别符。

那为什么我们会想到这么做呢?

我们一起想想,排序的作用是什么,也就是让互为字母异位词的单词的字母按顺序排列作为识别符,这样相同识别符的就是字母异位词。但是时间复杂度有点高。

然后我们就在想,要是能不需要和其他字母比较,直接把字母放在他该放的位置就好了。

这样时间复杂度就低了,上面的话也就说O(1)的时间把字母放在该放的地方,这个概念有点熟悉呀,这不就是hash吗!

那怎么才能O(1)呢,这时候我们又想起来字母是有ascii码的,这说明可以根据ascii码做一下,于是我们就想到了用数组直接做个表,存储下字母出现的次数,然后最后直接判断识别符是否相同就可以了。

或则换一个思路,字母异位词有一个特性,就是字母出现的频率是相同的,只需要把这个频率记录下来,这个题就做出来了。

代码实现

排序做法

class Solution {public String getSort(String word) {char[] word_chars=word.toCharArray();for(int i=0;i<word_chars.length;i++){char tmp=' ';for(int j=word_chars.length-1;j>i;j--){if(word_chars[j]<word_chars[j-1]){tmp=word_chars[j];word_chars[j]=word_chars[j-1];word_chars[j-1]=tmp;}}}return new String(word_chars);}public List<List<String>> groupAnagrams(String[] strs) {Map<String,List<String>> map=new HashMap<String,List<String>>();for (String str:strs){if(!map.containsKey(getSort(str))){map.put(getSort(str),new LinkedList<String>());} map.get(getSort(str)).add(str);}return new LinkedList(map.values());}
}

hash做法

class Solution {public String getSort(String word) {char[] chars = new char[27];for (int i = 0; i < 26; i++) {chars[i] = '0';}for (int i = 0; i < word.length(); i++) {int ascii = word.charAt(i);chars[ascii - 97]++;}return new String(chars);}public List<List<String>> groupAnagrams(String[] strs) {HashMap<String, List<String>> stringListHashMap = new HashMap<>();LinkedList<List<String>> lists = new LinkedList<>();for (String str : strs) {String str_sort = getSort(str);if (!stringListHashMap.containsKey(str_sort))stringListHashMap.put(str_sort, new LinkedList<String>());stringListHashMap.get(str_sort).add(str);}for (String s : stringListHashMap.keySet()) {List<String> strings = stringListHashMap.get(s);lists.add(strings);}return lists;}
}

总结

感觉还是要找规律,一想到字母频率的问题,其实这个题就做出来了。在这里插入图片描述

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

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

相关文章

【K8s】初识PV和PVC

​ 目录 收起 O、致谢 一、前言 二、Volume 2.1 什么是Volume 2.2 为什么要引入Volume 2.3 Volume类型有哪些 2.4 Volume如何使用 2.4.1 通过emptyDir共享数据 2.4.2 使用HostPath挂载宿主机文件 2.4.3 挂载NFS至容器 三、PV和PVC 3.1 什么是PV和PVC 3.2 为什么要引入PV和PVC 3…

Educational Codeforces Round 160 (Rated for Div. 2) D. Array Collapse(笛卡尔树+DP)

原题链接&#xff1a;D. Array Collapse 题目大意&#xff1a; 给你一个长度为 n n n 的排列 p p p &#xff0c;排列的定义为 [ 1 , 2 , 3 , . . , n ] [1,2,3,..,n] [1,2,3,..,n] 中每个数都出现 恰好 一次。 你可以做 任意多次 这样的操作&#xff1a; 选出一个任意长度…

PROTEL

PROTEL是什么 Protel软件是由Altium公司&#xff08;原为Protel Technology公司&#xff09;开发的一款电子设计自动化&#xff08;EDA&#xff09;软件&#xff0c;主要用于电子电路设计和印制电路板&#xff08;PCB&#xff09;制作。 学习Protel 99 SE的大致过程 原理图文…

芯科科技与Arduino携手推动Matter普及化

双方的合作可助力开发人员在两分钟内将新开发板配置入网 致力于以安全、智能无线连接技术&#xff0c;建立更互联世界的全球领导厂商Silicon Labs&#xff08;亦称“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;日前宣布&#xff0c;公司与开源硬件和软件领域的…

【MySQL】表的约束 -- 详解

表中一定要有各种约束&#xff0c;通过约束让我们在未来插入数据库表中的数据是符合预期的。约束本质是通过技术手段倒逼程序员插入正确的数据&#xff0c;反过来站在 MySQL 的角度&#xff0c;凡是插入进来的数据都是符合数据约束的。约束的最终目标&#xff1a;保证数据的完整…

【c语言】字符函数和字符串函数(上)

前言 在编程的过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了⽅便操作字符和字符串&#xff0c;C语⾔标准库中提供了⼀系列库函数~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 1. 字符分…

matlab采用不同数值方法求解微分方程

1、内容简介 略 60-可以交流、咨询、答疑 欧拉方法、改进欧拉、RK4、米尔斯坦方法求解微分方程 2、内容说明 略 lc; close all; clear all; % 参数赋值 global a global b global h a 1; b 2; Ni 1000; % 总步数 h 0.001; % 步长Xt1(1:Ni) 0; Xt2(…

【析】装卸一体化车辆路径问题的自适应并行遗传算法

0 引言 国内外有关 &#xff36;&#xff32;&#xff30;&#xff33;&#xff30;&#xff24;的文献较多&#xff0c;求解目标多以最小化车辆行驶距离为主&#xff0c;但现实中可能存在由租赁费用产生的单次派出成本&#xff0c;需要综合考 虑单次派车成本和配送路径成本。…

数据库系统概论(超详解!!!) 第一节 绪论

1.四个基本概念 1.数据&#xff08;Data&#xff09; 数据&#xff08;Data&#xff09;是数据库中存储的基本对象 数据的定义&#xff1a;描述事物的符号记录 数据的种类&#xff1a;数字、文字、图形、图像、音频、视频、学生的档案记录等 数据的含义称为数据的语义&…

设计模式(六)代理模式

相关文章设计模式系列 1.代理模式简介 代理模式介绍 代理模式也叫委托模式&#xff0c;是结构型设计模式的一种。在现实生活中我们用到类似代理模式的场景有很多&#xff0c;比如代购、代理上网、打官司等。 定义 为其他对象提供一种代理以控制这个对象的访问。 代理模式…

Java EE改名Jakarta EE,jakarta对程序开发的影响

一、前言 很多Java程序员在使用新版本的Spring6或者springboot3版本的时候&#xff0c;发现了一些叫jakarta的包。我在阅读开源工作流引擎camunda源代码的时候&#xff0c;也发展了大量jakarta的工程包。 比如&#xff1a;camunda的webapps编译工程就提供了2种方式javax和jaka…

精准测试探索

一、背景 什么是精准测试&#xff1f;通常研发提测的需求有代码变更&#xff0c;针对研发的代码变更点以及关联点进行测试&#xff0c;我们称之为精准测试。 很多时候&#xff0c;对变更点、影响范围的评估并不是很准确&#xff0c;偶尔会出现影响范围评估不全或者影响范围评…