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

相关推荐
独自破碎E17 小时前
【队列】求二叉树的层序遍历
leetcode
面汤放盐17 小时前
软件架构指南 Software Architecture Guide
java·微服务·devops
tkevinjd17 小时前
JUC5(线程池)
java·线程池·多线程·juc
Tao____17 小时前
如何对接Modbus-tcp协议(使用Thinlinks物联网平台)
java·物联网·网络协议·tcp/ip·modbus
鱼跃鹰飞17 小时前
经典面试题:K8S的自动缩扩容和崩溃恢复
java·容器·kubernetes
闻缺陷则喜何志丹17 小时前
【回文 字符串】3677 统计二进制回文数字的数目|2223
c++·算法·字符串·力扣·回文
Coder_Boy_17 小时前
Spring Boot 事务回滚异常 UnexpectedRollbackException 详解(常见问题集合)
java·spring boot·后端
青云交17 小时前
Java 大视界 -- 基于 Java+Redis Cluster 构建分布式缓存系统:实战与一致性保障(444)
java·redis·缓存·缓存穿透·分布式缓存·一致性保障·java+redis clus
不知疲倦的仄仄17 小时前
第五天:深度解密 Netty ByteBuf:高性能 IO 的基石
java·开源·github
Tisfy17 小时前
LeetCode 0085.最大矩形:单调栈
算法·leetcode·题解·单调栈