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

今日算法题 18---49.字母异位词分组

题目

49.字母异位词分组

要求

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

示例

示例 1:

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

输出:[["bat"],["nat","tan"],["ate","eat","tea"]]

解释:

  • 在 strs 中没有字符串可以通过重新排列来形成"bat"
  • 字符串"nat""tan"是字母异位词,因为它们可以重新排列以形成彼此。
  • 字符串"ate""eat""tea"是字母异位词,因为它们可以重新排列以形成彼此。

示例 2:

输入:strs = [""]

输出:[[""]]

示例 3:

输入:strs = ["a"]

输出:[["a"]]

思路1

互为字母异位词的两个字符串包含的字母相同且字母出现的次数也相同,因此可以将字母+出现次数+字母+出现次数.....组成字符串,作为哈希表的键,对应的多个或0个异位词作为哈希表的值

拿eat举例:a:1,e:1,t:1,对应的键就是a1e1t1,值为eat,再来一个单词tea:还是a:1,e:1,t:1,键为a1e1t1,已存在,就把tea加到值里,值变成了 [ eat,tea ]

代码1

class Solution { public List<List<String>> groupAnagrams(String[] strs) { Map<String,List<String>> map=new HashMap<>(); for(String str:strs){ int[] counts=new int[26]; int length=str.length(); //给字母计数 for(int i=0;i<length;i++){ counts[str.charAt(i)-'a']++; } //形成哈希表的键:字母+数字... StringBuffer sb=new StringBuffer(); for(int i=0;i<26;i++){ if(counts[i]!=0){ sb.append((char)('a'+i)); sb.append(counts[i]); } } //形成哈希表的值,字符串列表 String key=sb.toString(); List<String> list=map.getOrDefault(key,new ArrayList<String>()); list.add(str); map.put(key,list); } return new ArrayList<List<String>>(map.values()); } }

思路2

由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序后得到的字符串一定是相同的,可以将排序之后的字符串作为哈希表的键,未排序的字符串列表作为哈希表的值

代码2

class Solution { public List<List<String>> groupAnagrams(String[] strs) { Map<String,List<String>> map=new HashMap<String,List<String>>(); for(String str:strs){ char[] array=str.toCharArray(); Arrays.sort(array); String key=new String(array); List<String> list=map.getOrDefault(key,new ArrayList<String>()); //哈希表的value是原字符串列表list list.add(str); //把列表加入哈希表中 map.put(key,list); } return new ArrayList<>(map.values()); } }

小舟有话说

如果觉得不错的话,点点关注吧,下次不迷路~

http://www.jsqmd.com/news/556090/

相关文章:

  • EDA工具中setEditMode的10个隐藏技巧:提升布线效率的实用指南
  • 告别Electron臃肿!用Tauri + Vue3从零搭建一个5MB的桌面文件管理器(附完整Rust后端代码)
  • Juice高级配置指南:从邮件模板到响应式网页的CSS内联最佳实践
  • 容斥
  • FPGA存储资源怎么选?一张图看懂LUTRAM、BRAM和URAM的区别与选型指南
  • Opencv二维码识别实战:QRCodeDetector的高效应用与优化策略
  • 正点原子IMX6ULL史诗级新内核Linux7.0移植教程(7)触摸屏移植:GT9147/Goodix 驱动配置
  • 从零搭建到商业应用:知识图谱领域6款国外工具评测与下载指南
  • 这次咱们来拆解PFC二维浆岩直剪案例。这个案例有意思的地方在于它展示了颗粒材料与刚性墙体接触面的剪切行为,咱们边看代码边分析剪切曲线的门道
  • RAG还是微调?同事吵了三天没结果,我拿出一张对比表,全员沉默后疯狂点赞!
  • RESTful 金融数据 API 文档:设计原则与最佳实践
  • Kafka源码深度解析与面试攻坚:云原生和Serverless的融合之路
  • 从表单配置到多租户隔离:元数据驱动在低代码平台中的5个典型应用场景
  • 技术赋能B端拓客:号码核验行业的破局与价值深耕,氪迹科技法人股东核验筛选系统,阶梯式价格
  • Awoo Installer:Nintendo Switch多源安装引擎的技术架构深度解析
  • 漫画脸描述生成保姆级教程:从Docker Hub拉取镜像到生成首个角色
  • 如何用零配置小熊猫Dev-C++在5分钟内开启C++编程:完整新手指南
  • Mem Reduct终极指南:5分钟掌握Windows内存清理与优化技巧
  • Anything V5图像生成实战:快速部署与基础参数设置教程
  • 突破传统服装设计壁垒:Seamly2D开源解决方案赋能创意实现
  • 网盘直链下载助手完整教程:一键获取真实下载地址,告别限速烦恼!
  • 解决curl静态库链接错误:__imp__CertCloseStore@8等符号未定义问题
  • 计算机毕设 java 基于 Java+Spring 的疫苗接种管理系统的设计与实现 智能疫苗接种预约系统 疫苗接种全流程管理平台
  • DeerFlow开源项目部署与实践指南:从环境准备到生产落地
  • 技术赋能B端拓客:号码核验行业的革新之路与价值重塑,氪迹科技法人股东号码筛选系统,阶梯式价格
  • 3步掌握Umi-OCR批量处理:从海量图片中高效提取文字
  • 【Web逆向】实战解析:Protobuf数据逆向的两种高效方法
  • 4个步骤解决华硕笔记本显示异常:G-Helper色彩配置完全指南
  • 别再只盯着最后一个时间步了!手把手教你让CFD-POST完整读取Fluent瞬态数据(附2021R2版本避坑指南)
  • 网页设计必备:如何用占位图片提升用户体验(含懒加载和上传前处理技巧)