1. 字母异位词分组问题解析
这道LeetCode中等难度题目要求我们对字符串数组中的字母异位词进行分组。所谓字母异位词,指的是由相同字母重新排列组合形成的不同单词,比如"eat"、"tea"、"ate"就是一组典型的字母异位词。
在实际编程面试中,这类字符串处理问题非常常见。它不仅考察我们对哈希表等数据结构的掌握程度,也检验我们处理字符串的编程能力。我在多次面试中遇到过这道题的变种,发现很多候选人虽然能给出解法,但对时间复杂度的优化和边界条件的处理往往不够完善。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心解题思路分析
2.1 暴力解法及其局限性
最直观的解法是双重循环比较:外层循环遍历每个字符串,内层循环检查它是否与已分组的字符串是字母异位词。这种方法虽然简单,但时间复杂度高达O(n^2 * k),其中n是字符串数量,k是字符串平均长度,在LeetCode的大数据测试用例下必然会超时。
注意:判断两个字符串是否为字母异位词时,不能简单地比较排序后的字符串,因为字符串排序本身就需要O(klogk)的时间。
2.2 哈希表优化方案
更高效的解法是利用哈希表(字典)来存储分组结果。具体思路是:
- 遍历每个字符串
- 计算该字符串的特征值(可作为哈希键)
- 将相同特征值的字符串归入同一组
关键在于如何设计这个特征值。常见的有两种方法:
2.2.1 排序字符串作为键
将每个字符串排序后作为哈希表的键。例如:
- "eat" → "aet"
- "tea" → "aet"
- "tan" → "ant"
这种方法的时间复杂度是O(n*klogk),因为每个字符串都需要排序。
2.2.2 字母计数作为键
统计每个字符串中各个字母的出现次数,将计数结果作为键。例如:
- "eat" → [1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0]
- "tea" → 同上
这种方法的时间复杂度是O(n*k),因为只需要线性扫描字符串统计字母。
3. 代码实现与优化
3.1 Python实现(排序键方案)
python复制def groupAnagrams(strs):
from collections import defaultdict
