哈希算法题目:变位词组
字数 904 2025-10-29 11:31:55
哈希算法题目:变位词组
题目描述
给定一个字符串数组,例如 ["eat", "tea", "tan", "ate", "nat", "bat"],你需要将互为变位词(字母异位词)的字符串分组在一起,返回分组后的结果。变位词指字母相同但排列不同的字符串。例如,"eat" 和 "tea" 是变位词,应分到同一组。
解题思路
- 关键观察:变位词的字母组成相同,因此排序后的字符串一定相同。例如,
"eat"和"tea"排序后均为"aet"。 - 核心思路:使用哈希表,以排序后的字符串作为键,将原字符串存入对应键的列表中。
- 步骤:
- 遍历每个字符串,将其排序后作为键。
- 将原始字符串添加到该键对应的列表中。
- 最终返回哈希表中所有值(即分组后的列表)。
详细步骤
- 初始化哈希表:创建一个字典(或映射),键为排序后的字符串,值为原始字符串的列表。
- 处理每个字符串:
- 对当前字符串进行排序(需先转换为字符数组再排序)。
- 若排序后的字符串不在哈希表中,创建新列表并存入;若已存在,直接追加到列表。
- 输出结果:遍历哈希表的值,收集所有分组。
示例演示
以输入 ["eat", "tea", "tan", "ate", "nat", "bat"] 为例:
- 处理
"eat":排序为"aet",键"aet"对应列表["eat"]。 - 处理
"tea":排序为"aet",追加到键"aet"的列表,变为["eat", "tea"]。 - 同理,
"ate"也会加入"aet"的列表。 - 最终分组:
[["eat","tea","ate"], ["tan","nat"], ["bat"]]。
复杂度分析
- 时间复杂度:O(n k log k),其中 n 是字符串数量,k 是字符串最大长度(排序耗时 O(k log k))。
- 空间复杂度:O(n k),哈希表存储所有字符串。
优化方向
若字符串包含大量重复字符,可改用计数编码作为键(例如 "aet" 编码为 a1e1t1),避免排序开销,时间复杂度优化至 O(n k)。