字母异位词分组

标签: 数组 哈希表 字符串 排序

难度: Medium

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

注意:若两个字符串中每个字符出现的次数都相同,则称它们互为变位词。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

注意:本题与主站 49 题相同: https://leetcode-cn.com/problems/group-anagrams/

Submission

运行时间: 33 ms

内存: 18.9 MB

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        d = {}
        for s in strs:
            ordered_s = "".join(sorted(s))
            d.setdefault(ordered_s, [])
            d[ordered_s].append(s)
        return [x for x in d.values()]

Explain

本题解采用了一个哈希表(字典)来组织数据,其中键是字符串排序后的结果,而值是一个列表,包含所有排序后相同的原始字符串。遍历输入数组 `strs`,对于每个字符串,首先将其字符排序,得到一个有序的字符串,然后将原始字符串添加到哈希表的对应列表中。这样,所有变位词都会因为它们排序后的字符串相同而被归到同一个列表中。最后,返回哈希表中所有值构成的列表。

时间复杂度: O(n * k log k)

空间复杂度: O(n)

class Solution:
    def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
        d = {}  # 创建一个字典用于存储分组后的变位词
        for s in strs:  # 遍历给定的字符串列表
            ordered_s = "".join(sorted(s))  # 对每个字符串进行排序
            d.setdefault(ordered_s, [])  # 如果排序后的字符串不在字典中,则初始化为空列表
            d[ordered_s].append(s)  # 将原字符串加入到对应的列表中
        return [x for x in d.values()]  # 返回字典中所有值构成的列表

Explore

使用排序字符串作为哈希表的键是因为这种方法简单且直接。通过对字符串进行排序,所有的异位词都会变成相同的字符串,从而可以用这个字符串作为键来归类。此外,这种方法在实现上很直观,易于编码和理解。相比之下,字符计数虽然在某些情况下可能更节省空间,但需要额外的逻辑来生成和比较每个字符的计数,这在代码上可能更复杂。因此,在考虑到实现的简洁性和直观性时,选择使用排序字符串作为键是合适的。

`setdefault`方法在哈希表中对于处理键的存在性提供了一种便捷方式。使用`setdefault`,如果键不存在,则会自动将键和一个默认值(如空列表)添加到字典中,并返回该值;如果键已存在,则返回对应的值。这避免了编写额外的条件语句来检查键是否存在。虽然`setdefault`提供了代码简洁性,但在性能上,直接检查键是否存在(使用`if key in dict`)然后再添加,可能更高效,因为`setdefault`总是会进行一次查找操作,无论键是否存在。在性能敏感的应用中,直接检查键的存在性可能是更优的选择。

在给定的题解中,即使输入列表中包含重复的字符串,每个字符串都会被处理。字符串排序和添加到哈希表的过程中不会自动排除重复的字符串。每个字符串,无论是否与之前的字符串相同,都会被排序并尝试添加到哈希表中。如果希望避免处理相同的字符串,可以首先将输入的字符串列表转换成集合(set),从而去除任何重复项,然后再进行排序和添加到哈希表的操作。但这取决于是否希望在结果中保留重复的异位词组。如果要保留输入中的重复字符串,当前的处理方式是适当的。