跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

LeetCode 49 字母异位词分组详解

综述由AI生成介绍 LeetCode 49 字母异位词分组的解法。核心思路是将字符串字符排序后作为哈希表的键,将互为异位词的字符串归入同一列表。使用 Java 实现,涉及 HashMap 键值映射、字符数组转换与排序、getOrDefault 方法等知识点。文章解析了代码逻辑与执行流程,总结了常见错误及哈希表在分组场景中的应用技巧。

星星泡饭发布于 2026/3/28更新于 2026/6/122 浏览

一、题目回顾

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

示例 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 <= strs.length <= 10^4
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

二、整体思路(用一个'统一标识'来分组)

如果两个字符串是字母异位词,那么把它们各自的字符按字母顺序排序后,得到的结果一定完全相同。 反过来,排序后相同的字符串,一定是字母异位词。

所以,我们可以:

  1. 对每个字符串,将其字符排序,得到它的'标准化形式'。
  2. 以这个标准化形式作为分组标识(key),把原始字符串放到对应的组里。
  3. 最后把所有的组取出来,就是答案。

三、预备知识

一开始做这道题的时候会很困惑,哈希表能不能实现一个键对多个值,难道我要创键好几个哈希表吗? 实际上不是'一个键对应多个值',而是'一个键对应一个列表,列表里可以存多个值'。

3.1 HashMap 的每个键永远只对应一个值

HashMap 本身不允许一个键直接映射到多个值,因为它的设计是 key → value 一对一。 但是我们可以通过让 value 成为一个集合(比如 List、Set)来达到逻辑上的'一对多'。

比如字母异位词分组这道题,我们可以用 Map<String, List>,key 是排序后的字符串,value 是 ArrayList,把同组的异位词都 add 到这个 list 里。

3.2 字符串与字符数组的转换

str.toCharArray( ):把字符串拆成一个个字符,放进 char[ ] 数组。 new String(char[ ]):把字符数组重新组合成一个新的字符串。

为什么不能直接用 str.sort()? 因为字符串是不可变的,没有 sort 方法,所以必须转成数组才能排序。

3.3 数组排序

Arrays.sort(char[ ]):对字符数组进行原地升序排序(会改变原数组)。 它是 Java 提供的快速排序实现,直接拿来用即可。

3.4 HashMap —— 键值对字典

Map<K, V> 是一个接口,HashMap 是其常用实现。 这里的泛型是 Map<String, List>,表示键是字符串,值是一个存放字符串的列表。

为什么值是 List? 因为一个标准化字符串(键)可能对应多个原始单词,必须用容器把它们都装起来。

3.5 getOrDefault —— 简化'取或建'

map.getOrDefault(key, defaultValue):

如果 key 存在,返回它对应的 value; 如果 key 不存在,返回 defaultValue(在这里是一个新创建的 ArrayList)。

这行代码替代了传统的 if (map.containsKey(key)) {…} else {…},非常简洁。

3.6 增强 for 循环

for (String str : strs) 是遍历数组或集合的简洁写法,不需要写索引。 它等价于 for (int i = 0; i < strs.length; i++) { String str = strs[i]; … }。


四、代码实现(Java 解法)

4.1 正确代码

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

4.2 代码流程图解(以

[ "eat", "tea", "tan", "ate", "nat", "bat" ] 为例)

(图片链接已移除)


五、总结

这段代码虽然短,但包含了 哈希表、排序、集合转换 等多个知识点。 getOrDefault 是让代码更简洁优雅,但不是必须的。 核心是找到一组数据的共同标识,这是哈希表分组的通用思想。

以后再遇到'根据某个特征分组'的题(比如按频率、按长度、按奇偶),我们就能马上想到用 HashMap 了!

5.1 常见误区

  1. ❌ 忘记 import java.util.* 导致编译失败。
  2. ❌ 忘记 list.add(str) 导致所有分组为空。
  3. ❌ 试图 new List<>() 导致编译错误。
  4. ❌ 误用 array.toString() 而不是 new String(array)。

5.2 这道题教会了我们什么?

  1. 转化思想:把'字母异位词'这种抽象关系,转化为'排序后字符串相等'这种具体可比较的关系。
  2. 哈希表分组:利用哈希表快速查找分组,是解决'分组'类问题的利器。
  3. Java 集合的灵活使用:泛型、菱形运算符、getOrDefault、ArrayList 构造方法等,都是日常开发中非常实用的工具。

目录

  1. 一、题目回顾
  2. 二、整体思路(用一个“统一标识”来分组)
  3. 三、预备知识
  4. 3.1 HashMap 的每个键永远只对应一个值
  5. 3.2 字符串与字符数组的转换
  6. 3.3 数组排序
  7. 3.4 HashMap —— 键值对字典
  8. 3.5 getOrDefault —— 简化“取或建”
  9. 3.6 增强 for 循环
  10. 四、代码实现(Java 解法)
  11. 4.1 正确代码
  12. 4.2 代码流程图解(以
  13. 五、总结
  14. 5.1 常见误区
  15. 5.2 这道题教会了我们什么?
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Java API 爬虫实战:URL、正则与带条件数据提取策略
  • Python 格式化输出详解:占位符、format 与 f-string
  • FFmpegFreeUI 图形化界面使用指南:音视频格式转换与压缩
  • Spring Cloud 微服务:使用 OpenFeign 优雅实现远程调用
  • 基于 Zynq FPGA 的雷龙 SD NAND 测试实践
  • 汽车雷达多径干扰下的幽灵目标检测与算法分析
  • Prompt 工程:大语言模型高效使用指南
  • Python 函数闭包概念详解与应用实例
  • 基于强化学习Q-learning的无人机三维路径规划原理与MATLAB实现
  • 基于 Figma、Claude 与 Weavy AI 的 UI 设计工作流实战
  • 2026 年大模型全景解析:国产登顶、百万上下文与 Agent 工业化
  • Linux 进程信号详解:产生方式与闹钟机制
  • OpenClaw 接入飞书机器人与 Ollama 本地大模型部署指南
  • P2P 网络(Peer-to-Peer Network)基础架构与区块链应用
  • Spring Boot 集成华为云 OBS 实现文件上传与预览功能
  • 支持向量机(SVM)原理与 Python 代码实现:分类与回归详解
  • faster-whisper 语音识别性能优化与部署实践
  • 美以伊战中 AI 全场景落地细节与成效实战解析
  • Whisper-base.en:74M 参数打造精准英文语音识别工具
  • OpenClaw 接入飞书机器人并集成 Ollama 本地大模型实战

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online