您现在的位置是:首页 >技术杂谈 >【LeetCode Hot100】 字母异位词分组[特殊字符]哈希表+排序,Java实现!保姆级图文拆解网站首页技术杂谈

【LeetCode Hot100】 字母异位词分组[特殊字符]哈希表+排序,Java实现!保姆级图文拆解

AllowM 2025-12-24 00:01:03
简介【LeetCode Hot100】 字母异位词分组[特殊字符]哈希表+排序,Java实现!保姆级图文拆解

💻 [LeetCode Hot100] 字母异位词分组🔥哈希表+排序,Java实现!保姆级图文拆解

✏️本文对应题目链接:字母异位词分组


📌 题目描述

给你一个字符串数组 strs,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。
字母异位词:由重新排列后相同的字母组成的字符串(例如 “eat” 和 “tea”)。

示例:

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

� 解题思路(图文分解)

❗ 核心难点

如何快速判断多个字符串是否为字母异位词?

哈希表+排序法(黄金思路)✨

关键步骤:

  1. 创建哈希表key为排序后的字符串,value为原始字符串列表
  2. 遍历每个字符串:排序后作为哈希表的键
  3. 分组存储:将未排序的原始字符串存入对应键的列表中

动态过程图解:

输入 "eat" → 排序后 "aet" → 存入哈希表 {"aet": ["eat"]}
输入 "tea" → 排序后 "aet" → 追加到列表 → {"aet": ["eat","tea"]}
...最终合并所有值即为答案

🚀 代码实现

import java.util.*;

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        // 创建哈希表,key为排序后的字符串,value为原始字符串列表
        Map<String, List<String>> map = new HashMap<>();
        
        // 遍历每个字符串
        for (String s : strs) {
            // 将字符串转换为字符数组并排序
            char[] charArray = s.toCharArray();
            Arrays.sort(charArray);
            // 将排序后的字符数组转换为字符串作为key
            String key = new String(charArray);
            
            // 如果key不存在,则创建一个新的列表
            if (!map.containsKey(key)) {
                map.put(key, new ArrayList<>());
            }
            // 将原始字符串添加到对应的列表中
            map.get(key).add(s);
        }
        
        // 返回哈希表中所有值(即分组后的列表)
        return new ArrayList<>(map.values());
    }
}

💡 复杂度分析

  • 时间复杂度:O(nklogk)
    • n为字符串数量,k为字符串最大长度(排序每个字符串需O(klogk))
  • 空间复杂度:O(nk) → 存储所有字符串

🌟 总结要点

哈希表核心作用:快速定位同类异位词分组
排序标准化:将乱序字符串转换为唯一标识
适用场景:需要按特征分类的题目(如本题、DNA序列分组)


风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。