LC 49.字母异位词分组

2024-04-16 08:36
文章标签 分组 字母 lc 49 异位

本文主要是介绍LC 49.字母异位词分组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

49.字母异位词分组

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

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

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]

示例 2:

输入: strs = [""]
输出: [[“”]]

示例 3:

输入: strs = ["a"]
输出: [[“a”]]

提示:

  • 1 ≤ s t r s . l e n g t h ≤ 1 0 4 1 \leq strs.length \leq 10^4 1strs.length104
  • 0 ≤ s t r s [ i ] . l e n g t h ≤ 100 0 \leq strs[i].length \leq 100 0strs[i].length100
  • strs[i] 仅包含小写字母

解法一(HashMap+排序)

思路分析:

  1. 对于 满足 字符串中的字符 按字母顺序排序后的 字符串相同的 字符串为一组,因此我们可以使用哈希表来进行保存

  2. 若对于一个字符串str,将其按照字母顺序重新排序后的字符串string,其在哈希表中出现过,则将str保存到哈希表中对应的列表中

  3. 若没有出现过,则需要创建新的字符串列表,并进行保存

  4. 遍历完字符串数组strs时,则完成了分组

实现代码如下:

class Solution {public List<List<String>> groupAnagrams(String[] strs) {// 哈希表 统计字母异位词 出现的 字符串HashMap<String, List<String>> hashString = new HashMap<>();for (String str : strs) {    // 遍历数组strschar[] charArray = str.toCharArray();    // 将字符串转化为字符数组Arrays.sort(charArray);        // 对字符数组进行排序String string = Arrays.toString(charArray);    // 将排序好的字符数组转化为字符串List<String> stringList;    // 保存 相互为字母异位词的 字符串if (hashString.containsKey(string)) {    // 若哈希表中已存在该种字母异位词stringList = hashString.get(string);    // 则将保存列表返回} else {stringList = new ArrayList<>();        // 否则创建新列表}stringList.add(str);    // 将该字符串保存到对应的 字母异位词列表中hashString.put(string, stringList); // 并保存到哈希表}return new ArrayList<>(hashString.values());    // 将哈希表中的结果返回}
}

提交结果如下:

解答成功:执行耗时:9 ms,击败了30.66% 的Java用户内存消耗:46.4 MB,击败了8.04% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n ⋅ ( m l o g m + 2 m ) ) O(n \cdot (mlog^m+2m)) O(n(mlogm+2m)),其中,m为每个字符串的长度,排序花费 O ( m l o g m ) O(mlog^m) O(mlogm),将其转化为字符数组和重新转化为字符串花费 O ( 2 m ) O(2m) O(2m),n指的是字符串数组strs的长度

  • 空间复杂度: O ( n ⋅ m ) O(n \cdot m) O(nm)

解法二(HashMap+计数)

思路分析:

  1. 对于属于同一组字符异位词,除了按照规定顺序排序之后,可作为标识之外,还可以对其含有的字符进行计数,然后将其包含的字符和数目合并为一个标识字符串

  2. 如此,即可作为map的关键值

实现代码如下:

class Solution {public List<List<String>> groupAnagrams(String[] strs) {// 哈希表 统计字母异位词 出现的 字符串HashMap<String, List<String>> hashString = new HashMap<>();for (String str : strs) {    // 遍历数组strs// 获取字符统计结果字符串String recordsByString = getRecordsByString(str);List<String> strsList = hashString.getOrDefault(recordsByString, new ArrayList<>());strsList.add(str);    // 将其添加到哈希表的值中hashString.put(recordsByString, strsList);}return new ArrayList<>(hashString.values());    // 将哈希表中的结果返回}// 对字符串出现的字符及数量进行统计// 将统计的字符 及其数目 拼接成字符串返回public String getRecordsByString(String str) {int[] records = new int[26];int len = str.length();for (int i = 0; i < len; ++i) {records[ str.charAt(i) - 'a' ] ++;}StringBuilder sb = new StringBuilder();for (int i = 0; i < 26; ++i) {if (records[i] != 0) {sb.append(i+'a');sb.append(records[i]);}}return sb.toString();}
}

提交结果如下:

解答成功:执行耗时:9 ms,击败了30.66% 的Java用户内存消耗:46 MB,击败了19.57% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n ( k + ∣ Σ ∣ ) ) O(n(k+|Σ|)) O(n(k+∣Σ∣)),n为数组strs的长度,k是strs中字符的最大长度, ∣ Σ ∣ = 26 |Σ|=26 ∣Σ∣=26,遍历每个字符串时,还需要遍历一遍统计数组,其长度为26

  • 空间复杂度: O ( n ( k + ∣ Σ ∣ ) ) O(n(k+|Σ|)) O(n(k+∣Σ∣)),需要用哈希表来存储,n为数组strs长度,k则是字符串的长度,此外还有生成的哈希表的键

这篇关于LC 49.字母异位词分组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/908296

相关文章

使用Python在Excel中创建和取消数据分组

《使用Python在Excel中创建和取消数据分组》Excel中的分组是一种通过添加层级结构将相邻行或列组织在一起的功能,当分组完成后,用户可以通过折叠或展开数据组来简化数据视图,这篇博客将介绍如何使... 目录引言使用工具python在Excel中创建行和列分组Python在Excel中创建嵌套分组Pyt

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

Solr 使用Facet分组过程中与分词的矛盾解决办法

对于一般查询而言  ,  分词和存储都是必要的  .  比如  CPU  类型  ”Intel  酷睿  2  双核  P7570”,  拆分成  ”Intel”,”  酷睿  ”,”P7570”  这样一些关键字并分别索引  ,  可能提供更好的搜索体验  .  但是如果将  CPU  作为 Facet  字段  ,  最好不进行分词  .  这样就造成了矛盾  ,  解决方法

49个权威的网上学习资源网站

艺术与音乐 Dave Conservatoire — 一个完全免费的音乐学习网站,口号是“让每一个人都可以接受世界级的音乐教育”,有视频,有练习。 Drawspace — 如果你想学习绘画,或者提高自己的绘画技能,就来Drawspace吧。 Justin Guitar — 超过800节免费的吉他课程,有自己的app,还有电子书、DVD等实用内容。 数学,数据科学与工程 Codecad

第49课 Scratch入门篇:骇客任务背景特效

骇客任务背景特效 故事背景:   骇客帝国特色背景在黑色中慢慢滚动着! 程序原理:  1 、 角色的设计技巧  2 、克隆体的应用及特效的使用 开始编程   1、使用 黑色的背景: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7d74c872f06b4d9fbc88aecee634b074.png#pic_center)   2

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

Java8特性:分组、提取字段、去重、过滤、差集、交集

总结下自己使用过的特性 将对象集合根据某个字段分组 //根据id分组Map<String, List<Bean>> newMap = successCf.stream().collect(Collectors.groupingBy(b -> b.getId().trim())); 获取对象集合里面的某个字段的集合 List<Bean> list = new ArrayList<>

兔子--EditText去除下划线和输入字母和数字的限制

在设置密码输入框的时候,只允许输入数字和字母,设置如下属性:  android:digits="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 设置密码不可见(显示小黑点),并去除edittext的获取到焦点时候的下划线, 设置如下: