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

力扣100题---字母异位词分组

1.字母异位词分组

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

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
在这里插入图片描述

方法一:字母排序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution {public List<List<String>> groupAnagrams(String[] strs) {// 处理边界情况:如果输入数组为空,直接返回空列表if (strs.length == 0) return new ArrayList<>();// 创建哈希表:键为排序后的字符数组(字符串形式),值为该异位词组对应的字符串列表Map<String, List<String>> map = new HashMap<>();// 遍历输入的每个字符串for (String str : strs) {// 将字符串转换为字符数组,以便进行排序char[] chars = str.toCharArray();// 对字符数组进行排序(例如:"eat" → ['a', 'e', 't'])// 排序后相同异位词的字符数组顺序相同,可作为相同的键Arrays.sort(chars);// 将排序后的字符数组转换为字符串,作为哈希表的键// 例如:['a', 'e', 't'] → "aet"String key = String.valueOf(chars);// 检查哈希表中是否已存在该键// 如果不存在,创建一个新的空列表,并与该键关联if (!map.containsKey(key)) {map.put(key, new ArrayList<>());}// 将原始字符串添加到对应键的列表中// 例如:"eat" 和 "tea" 都会被添加到键 "aet" 对应的列表中map.get(key).add(str);}// 将哈希表中的所有值(列表集合)转换为一个大列表并返回// 每个子列表包含一组互为异位词的字符串return new ArrayList<>(map.values());}
}

方法二 字符计数法

在这里插入图片描述

时间复杂度和空间复杂度

在这里插入图片描述
在这里插入图片描述

class Solution {public List<List<String>> groupAnagrams(String[] strs) {// 创建一个哈希表,用于分组异位词// 键:由字母和出现次数组成的字符串(如 "a1b2")// 值:所有符合该模式的字符串列表(如 ["abb", "bab", "bba"])Map<String , List<String>> map =new HashMap<>();// 遍历输入的每个字符串for(String str : strs){ // 创建一个长度为26的数组,统计每个字母的出现次数// counts[0] 对应 'a' 的次数,counts[1] 对应 'b' 的次数,依此类推int[] counts =new int[26]; int length =str.length();// 遍历字符串中的每个字符,统计次数for(int i=0;i<length;i++){// 将字符转换为数组索引:'a' 变成 0,'b' 变成 1,...,'z' 变成 25// 对应位置的计数加1counts[str.charAt(i)- 'a' ] ++;}StringBuilder sb = new StringBuilder();// 生成用于哈希表的键// 按字母顺序拼接每个出现过的字母及其次数(如 "a1b2")for(int i= 0 ; i < 26 ; i++ ){if(counts[i]!= 0){// 添加字母(如 'a')sb.append((char)('a'+i));// 添加该字母的出现次数(如 2)sb.append(counts[i]);}}String key = sb.toString();// 将当前字符串添加到对应的分组中// 如果键不存在,创建一个新的列表// 如果键已存在,获取已有的列表List<String> list=map.getOrDefault(key,new ArrayList<>());list.add(str);map.put(key,list);}// 返回哈希表中所有的值(即所有分组)return new ArrayList<>(map.values());}}
http://www.xdnf.cn/news/689977.html

相关文章:

  • 力扣经典算法篇-16-最长公共前缀(顺序查找法,二分查找法,分治算法)
  • 学习率及相关优化参数详解:驱动模型高效训练
  • IP 风险画像技术略解
  • Parasoft C++Test软件单元测试_实例讲解(对多次调用的函数打桩)
  • apptrace 视角下移动端深度链接技术与优势​
  • 02-BTC-密码学原理 对hash算法如果出现漏洞的思考
  • MySQL 使用全局锁会导致的问题?
  • 【从零开始学习QT】Qt 概述
  • zookeeper 操作总结
  • 切换到旧提交,同时保证当前修改不丢失
  • K最近邻(KNN)算法完整实现指南
  • Linux -- gdb/cgdb的认识和使用
  • React Context 与状态管理:用与不用
  • 唯创WT2606B TFT显示灵动方案,重构电子锁人机互动界面,赋能智能门锁全场景交互!
  • 2025年北京市职工职业技能大赛第六届信息通信行业网络安全技能大赛复赛CTF部分WP-哥斯拉流量分析
  • 让Qt窗口覆盖整个桌面区域(支持多屏幕桌面)
  • 软件工程期末速成--附带几道题
  • 高光谱成像相机:表型技术在林业育种和精确林业的应用
  • element-plus bug整理
  • 操作系统(Operator System)
  • 从0到1掌握Kotlin高阶函数:开启Android开发新境界!
  • .NET 9的AI亮点
  • Vue2+Vuex通过数组动态生成store数据(扁平模式)
  • Dockerfile正确写法之现代容器化构建的最佳实践
  • docker镜像与dockerfile
  • C++修炼:map和set的封装
  • 【线程与进程区别】
  • 高效合并 Excel 表格实用工具
  • AIoT赋能场馆数字化转型:智能管理新生态
  • 拨云见日:Arbitrum引领EVM的未来