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

相关推荐
咖啡教室2 小时前
java日常开发笔记和开发问题记录
java
咖啡教室2 小时前
java练习项目记录笔记
java
鱼樱前端2 小时前
maven的基础安装和使用--mac/window版本
java·后端
RainbowSea3 小时前
6. RabbitMQ 死信队列的详细操作编写
java·消息队列·rabbitmq
RainbowSea3 小时前
5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
java·消息队列·rabbitmq
算AI4 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
李少兄5 小时前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
此木|西贝5 小时前
【设计模式】原型模式
java·设计模式·原型模式
可乐加.糖5 小时前
一篇关于Netty相关的梳理总结
java·后端·网络协议·netty·信息与通信
s9123601015 小时前
rust 同时处理多个异步任务
java·数据库·rust