哈希算法题目:变位词组
字数 904 2025-10-29 11:31:55

哈希算法题目:变位词组

题目描述
给定一个字符串数组,例如 ["eat", "tea", "tan", "ate", "nat", "bat"],你需要将互为变位词(字母异位词)的字符串分组在一起,返回分组后的结果。变位词指字母相同但排列不同的字符串。例如,"eat""tea" 是变位词,应分到同一组。

解题思路

  1. 关键观察:变位词的字母组成相同,因此排序后的字符串一定相同。例如,"eat""tea" 排序后均为 "aet"
  2. 核心思路:使用哈希表,以排序后的字符串作为键,将原字符串存入对应键的列表中。
  3. 步骤
    • 遍历每个字符串,将其排序后作为键。
    • 将原始字符串添加到该键对应的列表中。
    • 最终返回哈希表中所有值(即分组后的列表)。

详细步骤

  1. 初始化哈希表:创建一个字典(或映射),键为排序后的字符串,值为原始字符串的列表。
  2. 处理每个字符串
    • 对当前字符串进行排序(需先转换为字符数组再排序)。
    • 若排序后的字符串不在哈希表中,创建新列表并存入;若已存在,直接追加到列表。
  3. 输出结果:遍历哈希表的值,收集所有分组。

示例演示
以输入 ["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)。

哈希算法题目:变位词组 题目描述 给定一个字符串数组,例如 ["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)。