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"等。
然后,分析题目的要求,题目指出,要将同一组字母构成的字符串放在同一个列表当中,无关顺序,再将所有的组放入列表当中,无关顺序。这个问题的核心挑战在于:如何为具有相同字母组成的字符串生成唯一的"指纹”,使得所有字母异位词都能被映射到同一个标识符上。
这里提供三种设计:
- 排序字符串法: 最直观的解法是将每个字符串按字母顺序排序,排序后的字符串作为哈希表的键。这样,所有字母异位词经过排序后都会得到相同的字符串。
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())最后更新于