1. 问题背景与核心需求
字母异位词(Anagram)是指由相同字母重新排列组合形成的不同单词。比如"eat"、"tea"、"ate"就是一组字母异位词。在实际编程面试和算法练习中,这类问题经常出现,考察的是对数据结构的选择和运用能力。
LeetCode第49题要求我们:给定一个字符串数组strs,将其中所有字母异位词分组,返回分组后的列表。例如:
输入:["eat","tea","tan","ate","nat","bat"]
输出:[["bat"],["nat","tan"],["ate","eat","tea"]]
这个问题的核心在于如何高效判断两个字符串是否为字母异位词,以及如何设计数据结构来存储分组结果。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解决方案思路分析
2.1 暴力解法及其局限性
最直观的想法是双重循环遍历所有字符串组合,对每对字符串进行字母异位词判断。判断方法可以是:
- 对两个字符串分别排序,比较排序后的结果是否相同
- 统计每个字符串中各个字母的出现次数,比较统计结果是否相同
这种方法的时间复杂度为O(n^2 * klogk),其中n是字符串数量,k是字符串平均长度。当n较大时(比如10^4),这种解法显然效率太低。
2.2 哈希表优化思路
更高效的解法是利用哈希表(字典)来存储分组信息。具体思路是:
- 为每个字符串计算一个"特征值",相同字母异位词的特征值相同
- 使用哈希表存储特征值到字符串列表的映射
- 最后将哈希表中的所有值收集起来就是最终结果
关键在于如何设计这个"特征值"。常见的有两种方法:
- 将字符串排序后的结果作为特征值
- 统计字母出现次数,将统计结果(如字母计数数组)作为特征值
3. 具体实现与代码解析
3.1 基于排序的特征值方法
python复制def groupAnagrams(strs):
from collections import defaultdict
groups = defaultdict(list)
for s in strs:
# 将字符串排序后作为key
key = ''.join(sorted(s))
groups[key].append(s)
