LeetCode #49 字母异位词

LeetCode #49 字母异位词

题目

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

示例 1:

输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]

输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]

解释

  • 在 strs 中没有字符串可以通过重新排列来形成 “bat”。
  • 字符串 “nat” 和 “tan” 是字母异位词,因为它们可以重新排列以形成彼此。
  • 字符串 “ate” ,“eat” 和 “tea” 是字母异位词,因为它们可以重新排列以形成彼此。

示例 2:

输入: strs = [""]

输出: [[""]]

示例 3:

输入: strs = [“a”]

输出: [[“a”]]

提示:

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

分析

首先介绍所谓“字母异位词”(该翻译存在语义不明的问题,会客厅倾向于译作易位构词异序词),指的是拥有相同字母组成的两个不同字符串,例如"nat"和"ant",“niko"和"kino"等。

然后,分析题目的要求,题目指出,要将同一组字母构成的字符串放在同一个列表当中,无关顺序,再将所有的组放入列表当中,无关顺序。这个问题的核心挑战在于:如何为具有相同字母组成的字符串生成唯一的"指纹”,使得所有字母异位词都能被映射到同一个标识符上。

这里提供三种设计:

  1. 排序字符串法: 最直观的解法是将每个字符串按字母顺序排序,排序后的字符串作为哈希表的键。这样,所有字母异位词经过排序后都会得到相同的字符串。
def groupAnagrams(strs):
    from collections import defaultdict
    groups = defaultdict(list)

    for s in strs:
        # 排序字符串作为统一标识
        key = ''.join(sorted(s))
        groups[key].append(s)
    
    return list(groups.values())
最后更新于