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

相关推荐
2301_8073671918 小时前
C++中的解释器模式变体
开发语言·c++·算法
reembarkation18 小时前
光标在a-select,鼠标已经移出,下拉框跟随页面滚动
java·数据库·sql
愣头不青18 小时前
617.合并二叉树
java·算法
MIUMIUKK19 小时前
双指针三大例题
算法
灵感__idea19 小时前
Hello 算法:复杂问题的应对策略
前端·javascript·算法
麦麦鸡腿堡19 小时前
JavaWeb_请求参数,设置响应数据,分层解耦
java·开发语言·前端
2301_8194143020 小时前
C++与区块链智能合约
开发语言·c++·算法
Zaly.20 小时前
【Python刷题】LeetCode 1727 重新排列后的最大子矩阵
算法·leetcode·矩阵
做怪小疯子20 小时前
蚂蚁暑期 319 笔试
算法·职场和发展
计算机安禾20 小时前
【C语言程序设计】第37篇:链表数据结构(一):单向链表的实现
c语言·开发语言·数据结构·c++·算法·链表·蓝桥杯