哈希算法题目:字母异位词分组
字数 913 2025-10-25 17:27:26
哈希算法题目:字母异位词分组
题目描述:
给你一个字符串数组,要求将字母异位词组合在一起。字母异位词是由重新排列源单词的所有字母得到的一个新单词。你可以按任意顺序返回结果列表。
示例:
输入:strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出:[["bat"],["nat","tan"],["ate","eat","tea"]]
解题过程:
第一步:理解字母异位词的关键特征
字母异位词的核心特征是:当对单词中的字母进行排序后,所有的异位词都会得到相同的字符串。比如:
- "eat" → "aet"
- "tea" → "aet"
- "ate" → "aet"
这三个词排序后都得到"aet",因此它们是字母异位词。
第二步:选择合适的数据结构
我们需要一个哈希表(字典)来建立"排序后的字符串"与"原始字符串列表"之间的映射关系。键是排序后的字符串,值是对应的原始字符串列表。
第三步:算法实现步骤
- 创建一个空的哈希表(字典)
- 遍历输入数组中的每个字符串:
- 将当前字符串转换为字符数组并排序
- 将排序后的字符数组转换回字符串作为键
- 如果该键不在哈希表中,创建一个新的空列表作为值
- 将原始字符串添加到对应键的列表中
- 返回哈希表中所有的值组成的列表
第四步:具体示例演示
以输入["eat","tea","tan"]为例:
- 处理"eat":排序得"aet" → 映射:{"aet": ["eat"]}
- 处理"tea":排序得"aet" → 映射:{"aet": ["eat","tea"]}
- 处理"tan":排序得"ant" → 映射:{"aet":["eat","tea"], "ant":["tan"]}
第五步:复杂度分析
时间复杂度:O(nklogk),其中n是字符串个数,k是字符串最大长度。排序每个字符串需要O(klogk)时间。
空间复杂度:O(nk),哈希表需要存储所有字符串。
第六步:优化思考
如果字符串很长,排序开销较大。可以考虑使用字符计数作为键:统计每个字母出现的次数,用"#1#2#0..."的形式作为键,避免排序操作。