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

算法刷题记录 —— 字母异位词分组(Group Anagrams)

题目链接:49. 字母异位词分组


题目分析

这道题刚看到的时候确实没什么头绪。现在回过头来理解,核心思想其实非常简洁:利用哈希表的键值对机制——同一个键只能对应一条记录。​

对于"ant""tna""tan"这样的字母异位词,它们有一个共同的特点:排序之后的字符串完全相同(都是"ant")。既然如此,把排序后的字符串作为哈希表的 key,具有相同字母构成的单词天然就会被归到同一个 key 下面,value 则用一个List<String>来收纳这一组的所有原单词。

本质上这是一种"归一化"思路——给每个单词找一个规范形式,形式相同的归为一组。排序法是最直观的归一化手段,此外也可以用计数法(统计每个字母出现次数)来构建 key,但排序法代码最简洁。


实现

实现一:基础写法

classSolution{publicList<List<String>>groupAnagrams(String[]strs){Map<String,List<String>>map=newHashMap<>();for(Strings:strs){char[]chars=s.toCharArray();Arrays.sort(chars);Stringkey=newString(chars);if(!map.containsKey(key)){map.put(key,newArrayList<>());}map.get(key).add(s);}returnnewArrayList<>(map.values());}}

逻辑很直白:遍历每个单词 → 排序得到 key → 如果 key 不存在就新建一个空列表 → 把原单词加进去。最后map.values()直接就是分组结果。

容易踩的两个坑:​

  1. char[]不能直接当 key。Java 中数组的equalshashCode基于对象引用而非内容,两个内容相同的char[]会被当成不同的 key。必须用new String(chars)转成字符串。

  2. List的变量作用域。手写时容易把list声明在if块里面,外部拿不到。可以用map.get(key)直接在外部获取引用,更安全也更简洁。


实现二:使用computeIfAbsent简化

classSolution{publicList<List<String>>groupAnagrams(String[]strs){Map<String,List<String>>m=newHashMap<>();for(Strings:strs){char[]chars=s.toCharArray();Arrays.sort(chars);// computeIfAbsent:如果 key 不在哈希表中,则插入一个新的 ArrayListm.computeIfAbsent(newString(chars),_->newArrayList<>()).add(s);}returnnewArrayList<>(m.values());}}

思路和实现一一模一样,区别在于用computeIfAbsent一行替代了手动判断containsKey+put+get三步操作。

computeIfAbsent的行为:如果 key 存在,返回对应的 value;如果 key 不存在,执行 Lambda 创建新列表并放入 map,再返回这个新列表。拿到列表引用后直接.add(s)即可。代码量大幅减少,可读性也更好。


关键点总结

① 为什么排序后就能分组?

字母异位词的定义是"字母相同、排列不同"。排序抹平了排列差异——"eat""tea""ate"排序后全是"aet"。排序结果天然就是分组依据。

char[]String不可省略

这是 Java 初学者最容易忽略的细节。数组类型的equalshashCode是继承自Object的,比较的是内存地址,两个内容完全相同的char[]在 HashMap 眼中是不同的 key。new String(chars)才是值语义的比较。

computeIfAbsentvs 手动判断

方式代码行数可读性适用场景
手动containsKey+put+get适合新手理解流程逻辑较复杂的初始化
computeIfAbsent一行简洁优雅大多数场景推荐使用

小结

字母异位词分组是一道哈希表的经典应用题,难度不高但很能考察对 HashMap 核心特性的理解。抓住"归一化 → 分组"这条主线,无论用排序还是计数都能顺利解决。推荐先用基础写法把流程走通,再尝试用computeIfAbsent优化,两种写法都熟练掌握之后,这类题目基本可以秒过。

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

相关文章:

  • 2024年KMS_VL_ALL_AIO激活工具完全指南:3步实现Windows和Office自动续期激活
  • 传输层详解:stdio vs SSE vs Streamable HTTP
  • 2026年8月 | 折叠屏膜工厂**推荐名录 - 趣闻早乐评
  • 多厂商AI额度查询工具:一站式管理智谱、OpenCode Go、火山方舟、阿里Token Plan、DeepSeek官方额度, 下载即用无需安装
  • GPT-5编程测评大反转!表面不及格,实际63.1%的任务没交卷,全算上成绩比Claude高一倍
  • 在PPT中画一个圆 如何在圆上均匀布置点
  • 多项资质同步增项怎么选代办?2026广东6家建筑资质服务商客观测评|资质办理六大避坑要点全梳理 - 优质品牌中立测评推荐
  • 东南亚华裔EMBA横评:复旦华语校友圈与产业链优势 - 新闻快传
  • 测试与调试:MCP Inspector、单元测试、集成测试
  • 存储「量紧价降」、Rubin Ultra 双芯重构、CXL 被称「下一代 HBM」 —— AI 芯片简报 08.07-08.11
  • SRAM‑HBM 分块调度:大模型真正的瓶颈从来不是算力
  • 眉山热门上门电脑回收服务对比,手把手教你选到靠谱又省心的一家 - 官方资讯
  • 烘焙店收银系统怎么选?五款主流方案从预订到会员复购的实测对比
  • 不燃电解液锂金属循环差的真相:不是SEI持续分解,而是传输特性
  • 2026年成都香港留学中介哪家值得信赖:五家优选深度解析 - 科技焦点
  • 擅长处理周大福老凤祥旧饰,工艺金估价实体,武汉黄金回收 - 资讯早知道
  • 华硕笔记本控制工具G-Helper使用教程:5步让电脑又快又省电
  • Java 程序员 2 天入门 AI 应用开发——8 个 Demo 全过程
  • 2026年成都全屋定制**:打造理想家居空间首选 - 官方资讯
  • 2026年抚州短视频代运营公司选型指南:服务模式、内容体系与中网创信合规参考 - 中国品牌价值观察网
  • openLCA 生命周期评估上手指南:一次踩坑引发的碳足迹核算实战全记录
  • 【advanced_llm】LLaMA 3.2 微调案例讲解
  • 成都榻榻米定制怎么选才不踩坑?口碑好的商家都注重这几点 - 官方资讯
  • logistics regression
  • 第 16 章 足底压力传感器:让机器人“感觉”到地面 极低成本 · 实物上手 · 可迁移至高端人形平台
  • 心电图的基础知识
  • fSpy-Blender 插件实战指南:用消失点标定完成 2D 照片到 3D 场景的相机透视匹配
  • 2026年+地域+阳光房公司选择指南(请你补充具体地域,我会为你生成更准确的标题) - 优企甄选
  • 上门摄影服务全攻略:从预约到成片,轻松记录美好时刻
  • 钉钉虚拟定位怎么设置?XposedRimetHelper 三步实操避坑指南