
LeetCode 49. 字母异位词分组的核心思路是哈希表字典映射将每个单词转换为一个“唯一标识Key”然后把拥有相同 Key 的单词归入同一个列表Value中。在 Python3 中有几种常见且高效的实现方式下面为你提供两种最经典的解法解法一排序作为 Key最直观推荐将单词的字符排序后作为字典的 Key。因为异位词排序后的结果是完全相同的字符串。class Solution:def groupAnagrams(self, strs: list[str]) - list[list[str]]:anagram_map {}for word in strs: # 将单词排序后转为字符串作为 key sorted_word .join(sorted(word)) # 使用 get 方法获取列表如果不存在则返回空列表 if sorted_word not in anagram_map: anagram_map[sorted_word] [] anagram_map[sorted_word].append(word) return list(anagram_map.values())解法二字符频次作为 Key最优避免排序开销统计每个单词中 26 个字母的出现次数将次数元组作为 Key。适合单词长度较大的情况。class Solution:def groupAnagrams(self, strs: list[str]) - list[list[str]]:anagram_map {}for word in strs: # 初始化 26 个字母的计数器 count [0] * 26 for char in word: count[ord(char) - ord(a)] 1 # 列表不能直接作为字典的 key必须转为不可变的元组 key tuple(count) if key not in anagram_map: anagram_map[key] [] anagram_map[key].append(word) return list(anagram_map.values()) Python3 优雅写法一行流优化Python 的 collections.defaultdict 可以省去判断 key 是否存在的代码让逻辑更简洁from collections import defaultdictclass Solution:def groupAnagrams(self, strs: list[str]) - list[list[str]]:anagram_map defaultdict(list)for word in strs: anagram_map[tuple(sorted(word))].append(word) return list(anagram_map.values()) 核心要点解析哈希表的巧妙运用这道题的难点不在于算法而在于如何设计 Key。无论是排序字符串还是字母频次元组都是为了把“异位词”映射到同一个桶里。元组与列表的区别在 Python 中list 是可变对象不能直接作为字典的 Key而 tuple 是不可变对象可以安全地作为 Key解法二中 tuple(count) 的原因。复杂度分析排序法时间复杂度 O(N cdot K log K)其中 N 是字符串个数K 是字符串最大长度。空间复杂度 O(N cdot K)。计数法时间复杂度 O(N cdot K)省去了排序的 log K 开销在极端长字符串下表现更好。空间复杂度 O(N cdot K)。如果你刚做完这道题强烈建议紧接着做 LeetCode 242. 有效的字母异位词判断两个词是否为异位词和 LeetCode 438. 找到字符串中所有字母异位词滑动窗口它们都是这套思想的延伸