【LeetCode】49. 字母异位词分组(Java自用版)

排序法:

java 复制代码
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>());
            list.add(str);
            map.put(key, list);
        }
        return new ArrayList<List<String>>(map.values());
    }
}

上面的Java代码定义了一个Solution类,其中包含一个名为groupAnagrams的公共方法。这个方法的目标是将一个字符串数组strs中的字符串按照它们的字母顺序(即它们的字母异位词)进行分组。

以下是对代码的详细分析:

  1. 初始化

    • 首先,代码初始化了一个HashMap,键是排序后的字符串(作为字母异位词的标识),值是一个字符串列表,包含所有与该键匹配的原始字符串。
java 复制代码
Map<String, List<String>> map = new HashMap<String, List<String>>();
  1. 遍历字符串数组

    • 对于strs数组中的每个字符串str,代码执行以下操作:
java 复制代码
for (String str : strs) {
  1. 转换并排序字符串

    • 将字符串转换为字符数组。
    • 使用Arrays.sort方法对字符数组进行排序。
    • 使用排序后的字符数组创建一个新的字符串key,该字符串将作为HashMap的键。
java 复制代码
char[] array = str.toCharArray();
Arrays.sort(array);
String key = new String(array);
  1. 获取或创建列表

    • 使用map.getOrDefault方法尝试从HashMap中获取与key关联的列表。
    • 如果key不存在,则使用new ArrayList<String>()创建一个新的空列表。
java 复制代码
List<String> list = map.getOrDefault(key, new ArrayList<String>());
  1. 添加字符串到列表

    • 将原始的未排序的字符串str添加到获取到的列表list中。
java 复制代码
list.add(str);
  1. 更新HashMap

    • 使用map.put方法将更新后的列表(现在包含了一个新的字符串)与key关联起来。
java 复制代码
map.put(key, list);
  1. 返回结果

    • 最后,代码从HashMap中获取所有的值(即所有分组后的字符串列表),并将它们放入一个新的ArrayList中,然后返回这个ArrayList
java 复制代码
return new ArrayList<List<String>>(map.values());

总结

这个groupAnagrams方法的核心思想是将字符串转换为它们的字母顺序形式,然后使用这些排序后的字符串作为键来将原始字符串分组。由于字母异位词在排序后将具有相同的字符串表示形式,因此它们将被分组到同一个列表中。这种方法可以有效地将字母异位词分组,并且对于较大的输入数据集也能保持良好的性能。

相关推荐
adam_life8 分钟前
http://noi.openjudge.cn/——2.5基本算法之搜索——200:Solitaire
算法·宽搜·布局唯一码
iuyou️25 分钟前
Spring Boot知识点详解
java·spring boot·后端
北辰浮光28 分钟前
[Mybatis-plus]
java·开发语言·mybatis
一弓虽37 分钟前
SpringBoot 学习
java·spring boot·后端·学习
南客先生41 分钟前
互联网大厂Java面试:RocketMQ、RabbitMQ与Kafka的深度解析
java·面试·kafka·rabbitmq·rocketmq·消息中间件
ai大佬1 小时前
Java 开发玩转 MCP:从 Claude 自动化到 Spring AI Alibaba 生态整合
java·spring·自动化·api中转·apikey
我想进大厂1 小时前
图论---朴素Prim(稠密图)
数据结构·c++·算法·图论
我想进大厂1 小时前
图论---Bellman-Ford算法
数据结构·c++·算法·图论
AIGC大时代1 小时前
高效使用DeepSeek对“情境+ 对象 +问题“型课题进行开题!
数据库·人工智能·算法·aigc·智能写作·deepseek
Mr__Miss1 小时前
面试踩过的坑
java·开发语言