Leetcode 49. 字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的所有字母得到的一个新单词。

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        if (strs == null || strs.length == 0) return new ArrayList<>();
        
        Map<String, List<String>> map = new HashMap<>();
        
        for (String s : strs) {
            char[] charArray = s.toCharArray();
            Arrays.sort(charArray); // 对每个字符串的字符进行排序
            String sorted = new String(charArray); // 得到排序后的字符串
            
            if (!map.containsKey(sorted)) { // 如果哈希表中没有这个键,创建一个新的列表
                map.put(sorted, new ArrayList<>());
            }
            map.get(sorted).add(s); // 将原字符串添加到对应的列表中
        }
        
        return new ArrayList<>(map.values()); // 将哈希表中的所有值作为结果返回
    }
}

哈希表首先思考键和值是什么,这个方法首先创建了一个哈希表来存储每一组字母异位词,键是每个字符串排序后得到的结果,值是所有这个排序结果对应的原字符串列表。通过这种方式,我们可以有效地将所有的字母异位词分到同一组内。最后,我们返回这个哈希表中所有的值即可,这些值就是分组后的字母异位词列表。

目录

问题1: map.get(sorted).add(s);

问题2:char[] charArray = s.toCharArray()

问题3:else的逻辑

问题4:输出什么

问题5:String sorted = new String(charArray)


问题1: map.get(sorted).add(s);

  map.get(sorted).add(s);

这行代码是Java中操作哈希表(HashMap)的一种常见方式,用于向哈希表中的特定键对应的列表中添加一个元素。让我们分解这行代码来更好地理解其意义和工作原理:

  • map.get(sorted)这部分代码从哈希表map中获取与sorted这个键关联的值。在这个场景中,sorted是指当前字符串排序后得到的字符串。根据我们之前的设计,这个值是一个List<String>,即一个字符串列表,用来存储所有排序后相同的原字符串。

  • .add(s)这部分代码是List接口中的一个方法,用于将指定的元素s添加到列表的末尾。在这里,s是原始未排序的字符串。

将这两部分结合起来,map.get(sorted).add(s);的整体意思就是:首先从哈希表map中找到键为sorted的列表(即所有排序后与sorted相同的字符串的列表),然后向这个列表中添加当前的原始字符串s

问题2:char[] charArray = s.toCharArray()

char[] charArray = s.toCharArray(), 这里的charArray需要new嘛

在Java中,当你调用String类的toCharArray()方法时,它会自动创建一个新的字符数组,包含了字符串中的所有字符。因此,你不需要手动使用new关键字来创建这个数组。toCharArray()方法本身就负责分配必要的内存空间,并返回一个新的字符数组。这个返回的数组是原始字符串s的一个完整副本,但以字符数组的形式表示。

  • s.toCharArray()调用了字符串stoCharArray()方法,这个方法遍历字符串s中的所有字符,并将它们复制到一个新的字符数组中。
  • 这个新的字符数组被赋值给变量charArray

因此,不需要使用new char[]来手动创建数组。toCharArray()方法已经包含了创建和填充数组的所有必要步骤。

问题3:else的逻辑

else map.get(sorted).add(s); // 将原字符串添加到对应的列表中

一开始写成了这样,这意味着,仅当sorted键不存在于哈希表map中时,你才创建一个新列表,但如果这个键已经存在,你才会将字符串s添加到对应的列表中。这个逻辑是不完整的,因为你总是需要将当前的字符串s添加到列表中,无论这个列表是新创建的还是之前就存在的。

正确的逻辑是无条件地执行map.get(sorted).add(s);,即无论找到的键是否已经存在于哈希表中,都需要执行添加操作。不需要else语句,因为创建列表和向列表添加元素是两个互补的步骤,它们总是一起发生的:如果键不存在,你创建一个新的列表并随后向其添加元素;如果键已存在,你直接向现有的列表添加元素。以下是正确的代码片段:

if (!map.containsKey(sorted)) { // 如果哈希表中没有这个键,创建一个新的列表
    map.put(sorted, new ArrayList<>());
}
map.get(sorted).add(s); // 将原字符串添加到对应的列表中,这一步总是需要执行的

移除else关键字后,不论sorted对应的列表是否已经存在,你都会尝试向其添加当前的字符串s。这保证了所有的字符串,无论是触发了新列表的创建还是被添加到了已有的列表中,都袽正确处理。

问题4:输出什么

return new ArrayList<>(map.values()); // 将哈希表中的所有值作为结果返回

map.values():这个调用返回map(即你之前用来存储分组的HashMap)中所有值的集合。在这个上下文中,每个值都是一个列表(List<String>,其中包含了归为同一组的所有字符串。由于map的键是每个字符串排序后的结果,因此每个值(列表)实际上代表了一组字母异位词。最后,这个新创建的ArrayList被返回。这个ArrayList包含了若干个子列表,每个子列表都是一组字母异位词。

问题5:String sorted = new String(charArray)

String sorted = new String(charArray)

String类有一个构造函数,它可以接受一个字符数组,并基于这个数组中的字符顺序创建一个新的字符串。这意味着,即使charArray是从原始字符串s派生出来并被排序的,新创建的字符串sorted将包含相同的字符集,但按字典序排序。

  • 24
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值