LeetCode:字母异位词分组

2024-06-09 19:28
文章标签 leetcode 分组 字母 异位

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

文章收录于LeetCode专栏
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] 仅包含小写字母

排序

算法思路

  异位词是由相同数量的字母根据不同顺序排序而组成的字符串,我们根据此特性可以知道只要分别对两个字符串进行排序,排序后形成的两个新字符串一定相等,所以我们可以通过对字符串进行排序后比较的方式来判断当前两个字符串是否是异位词。再识别出数组中有哪些异位词之后,可以使用一个额外的hash表将同一类异位词放hash表中,最后将其value组装返回。

编码

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

复杂度分析

  时间复杂度:使用Java自带的排序算法O(n log n),同时最外层又对数组进行了遍历,因此时间复杂度为O(kn log n);
  空间复杂度:使用了一个哈希表暂存数据,其空间复杂度为O(kn)。

哈希表辅助计数

算法思路

  因为所有词组都是有小写字母组成,所以我们可以用计数法对词组中出现的字母进行遍历计数,最后将结果放入到一个额外的hash表中,每次往hash表中放入数据时都需先看是否存在同样字符数量的词组,如果已经存在就往已有集合中追加,反之直接插入。这里需要特别说明一下,放入hash表中的key是每个词组中字母+总次数,如“tea”就会转换为“a1e1t1”存入hash表中。

编码

class Solution{public List<List<String>> groupAnagrams(String[] strs){Map<String, List<String>> map = new HashMap<>();for(String str: strs){int[] count = new int[26];for(int i=0; i<str.length(); i++){count[str.charAt(i) - 'a']++;}StringBuilder sb = new StringBuilder();for(int i=0; i<26; i++){if(count[i] != 0){sb.append('a' + i);sb.append(count[i]);}}List<String> list = map.getOrDefault(sb.toString(), new ArrayList<>());list.add(str);map.put(sb.toString(), list);}return new ArrayList(map.values());}
}

复杂度分析

   时间复杂度:因为对数组进行了一次遍历且在每次遍历中对词组中每个字母进行处理,所以时间复杂度为0(n(k+26));
  空间复杂度:在使用哈希表暂存数据的基础之上,还额外使用了一个26长度的数组来存放每个字符的计数结果,最终的空间复杂度为O(n(k+26))。


一键三连,让我的信心像气球一样膨胀!

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


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

相关文章

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

Java如何根据文件名前缀自动分组图片文件

《Java如何根据文件名前缀自动分组图片文件》一大堆文件(比如图片)堆在一个目录下,它们的命名规则遵循一定的格式,混在一起很难管理,所以本文小编就和大家介绍一下如何使用Java根据文件名前缀自动分组图... 目录需求背景分析思路实现代码输出结果知识扩展需求一大堆文件(比如图片)堆在一个目录下,它们的命名规

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

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

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

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

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

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

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

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