LeetCode 热题 100 - 2. 字母异位词分组(Java 题解)

LeetCode 热题 100 - 2. 字母异位词分组(Java 题解)

题目链接

字母异位词分组 - LeetCode

难度

中等

题目描述

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

字母异位词 是由重新排列源单词的所有字母得到的一个新单词,两个单词包含完全相同的字母,只是顺序不同。

解题思路

本题的核心是找到字母异位词的唯一标识。互为字母异位词的字符串,排序后一定是完全相同的字符串

因此解题思路如下:

  1. 遍历字符串数组,将每个字符串字符排序,排序后的字符串作为唯一 key
  2. 使用 HashMap 存储,key 是排序后的字符串,value 是对应字母异位词列表;
  3. 遍历完成后,将 Map 中的所有 value 收集起来,就是最终分组结果。

这是最直观、面试最常写的解法,代码简洁易理解。

复杂度分析

  • 时间复杂度:O(nklogk)
    • n 是字符串数组长度,k 是字符串最大长度;
    • 每个字符串排序耗时 O(klogk)。
  • 空间复杂度:O(nk),存储所有字符串。

解题代码(Java)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        // key:排序后的字符串,value:对应的字母异位词列表
        Map<String, List<String>> map = new HashMap<>();

        for (String str : strs) {
            // 转为字符数组并排序,生成唯一key
            char[] array = str.toCharArray();
            Arrays.sort(array);
            String key = new String(array);

            // 从map中取出对应列表,不存在则创建新列表
            List<String> temp = map.getOrDefault(key, new ArrayList<>());
            temp.add(str);
            map.put(key, temp);
        }
        
        // 将map的值转为ArrayList返回
        return new ArrayList<List<String>>(map.values());
    }
}

代码解析

  1. HashMap 作用

    排序后的字符串为 key,把所有字母异位词聚合到同一个列表。

  2. 排序生成 key

    把字符串转成字符数组排序后,再转回字符串,互为异位词的字符串会得到相同 key。

  3. getOrDefault 方法

    简化代码:如果 key 不存在,返回空列表;存在则返回已有列表。

  4. 结果返回

    map.values() 拿到所有分组,再包装成 ArrayList 返回。

示例演示

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

排序后 key:

  • "eat" → "aet"
  • "tea" → "aet"
  • "tan" → "ant"
  • "ate" → "aet"
  • "nat" → "ant"
  • "bat" → "abt"

最终分组:

[["eat","tea","ate"],["tan","nat"],["bat"]]

易错点提醒

  1. 必须先排序再作为 key,不能直接用原字符串;
  2. 注意字符数组转字符串的写法:new String(array)
  3. 不要忘记导包:ArraysHashMapListArrayList

总结

本题是 HashMap + 字符串排序 的经典应用,核心思想是用排序后的字符串作为唯一标识进行分组,是面试高频题,代码简洁、思路清晰,必须熟练掌握。

持续更新 LeetCode Hot100 Java 题解,面试向~

posted @ 2026-04-13 10:17  ZhenyangQ  阅读(8)  评论(0)    收藏  举报