当前位置: 首页 > news >正文

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))。


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

http://www.lryc.cn/news/368193.html

相关文章:

  • 技术与业务的完美融合:大数据BI如何真正提升业务价值
  • 计网复习资料
  • 华为策略流控
  • 刷代码随想录有感(98):动态规划——爬楼梯
  • 零基础入门篇①⑦ Python可变序列类型--集合
  • 基于NodeJs 的Vue安装和创建项目
  • 【简单介绍下DALL-E2,什么是DALL-E2?】
  • springboot+mqtt使用总结
  • 搭建自己的组件库<2>dialog 组件
  • less学习笔记
  • 基于关键词自动采集抖音视频排名及互动数据(点赞、评论、收藏)
  • selenium中switch_to.window切换窗口的用法
  • 【nerf】nvidia-smi
  • 测试工具fio
  • 详解 Flink 的状态管理
  • 手机怎么压缩视频?归纳了三种快速压缩方案
  • 【实战】kafka3.X kraft模式集群搭建
  • 华为防火墙配置 SSL VPN
  • Redis的删除策略与内存淘汰
  • 《一心体系至善算法》“人文+AI”成果
  • C#面:阐述对DDD的理解
  • 音视频开发19 FFmpeg 视频解码- 将 h264 转化成 yuv
  • Mysql 常用命令 详细大全【分步详解】
  • 基于百度接口的实时流式语音识别系统
  • AIGC作答《2024年高考作文|新课标I卷》能拿多少分?
  • WHAT - 发布订阅
  • React@16.x(23)useEffect
  • 算法竞赛一句话解题经典问题分析 ©ntsc 2024
  • 【TensorFlow深度学习】强化学习中的贝尔曼方程及其应用
  • 牛客 NC129 阶乘末尾0的数量【简单 基础数学 Java/Go/PHP/C++】