哈希算法题目:有效的字母异位词
字数 1086 2025-10-25 19:16:30

哈希算法题目:有效的字母异位词

题目描述:给定两个字符串 s 和 t,编写一个函数来判断 t 是否是 s 的字母异位词。字母异位词是指由相同字母重排列形成的字符串,通常所有出现的字母次数也相同。例如,"anagram"和"nagaram"是字母异位词,而"rat"和"car"则不是。

解题过程:

步骤一:理解问题核心
首先,我们需要明确判断两个字符串是否为字母异位词的关键条件:

  1. 两个字符串的长度必须相等。如果长度不同,它们不可能是字母异位词。
  2. 字符串s中的每个字符,在字符串t中都必须出现,并且出现的次数要完全相同。

步骤二:选择数据结构
为了高效地统计每个字符出现的次数,哈希表(或称字典)是最佳选择。我们可以将字符作为键(key),将该字符出现的次数作为值(value)。

步骤三:构建字符频率哈希表

  1. 首先,检查两个字符串的长度。如果长度不相等,我们可以立即返回false,无需进行后续计算。
  2. 创建一个空的哈希表(比如一个字典char_count),用于记录字符的频率。
  3. 遍历第一个字符串s。对于s中的每一个字符:
    • 如果这个字符已经是哈希表中的一个键,那么将该键对应的值(计数)加1。
    • 如果这个字符还未出现在哈希表中,则将它作为新键加入哈希表,并将其值(计数)初始化为1。
      这个过程完成后,哈希表就存储了字符串s中每个字符的出现频率。

步骤四:比较字符频率

  1. 接下来,遍历第二个字符串t。对于t中的每一个字符:
    • 检查该字符是否存在于我们为字符串s创建的哈希表中。
      • 如果字符不存在于哈希表中,说明t包含了一个s中没有的字符,可以直接返回false
      • 如果字符存在,则将该字符在哈希表中对应的计数减1。
  2. 在遍历完整个字符串t后,我们还需要进行最后一次检查:确认哈希表中所有字符的计数是否都已被减至0。
    • 因为如果st是字母异位词,那么通过增加s的计数和减少t的计数,最终每个字符的净计数应该正好是0。
    • 如果存在任何一个字符的计数不为0,则返回false
    • 如果所有计数均为0,则返回true

步骤五:复杂度分析

  • 时间复杂度:O(n)。我们进行了三次线性遍历:一次检查长度,一次遍历字符串s,一次遍历字符串t(以及一次遍历有限的26个字母来检查计数,可视为常数时间)。因此总体时间复杂度是O(n)。
  • 空间复杂度:O(1)。虽然我们使用了额外的哈希表空间,但由于字母数量是有限的(比如小写英文字母只有26个),哈希表的大小不会随着输入字符串的长度n而增长,因此空间复杂度是常数级的O(1)。
哈希算法题目:有效的字母异位词 题目描述:给定两个字符串 s 和 t,编写一个函数来判断 t 是否是 s 的字母异位词。字母异位词是指由相同字母重排列形成的字符串,通常所有出现的字母次数也相同。例如,"anagram"和"nagaram"是字母异位词,而"rat"和"car"则不是。 解题过程: 步骤一:理解问题核心 首先,我们需要明确判断两个字符串是否为字母异位词的关键条件: 两个字符串的长度必须相等。如果长度不同,它们不可能是字母异位词。 字符串s中的每个字符,在字符串t中都必须出现,并且出现的次数要完全相同。 步骤二:选择数据结构 为了高效地统计每个字符出现的次数,哈希表(或称字典)是最佳选择。我们可以将字符作为键(key),将该字符出现的次数作为值(value)。 步骤三:构建字符频率哈希表 首先,检查两个字符串的长度。如果长度不相等,我们可以立即返回 false ,无需进行后续计算。 创建一个空的哈希表(比如一个字典 char_count ),用于记录字符的频率。 遍历第一个字符串 s 。对于 s 中的每一个字符: 如果这个字符已经是哈希表中的一个键,那么将该键对应的值(计数)加1。 如果这个字符还未出现在哈希表中,则将它作为新键加入哈希表,并将其值(计数)初始化为1。 这个过程完成后,哈希表就存储了字符串 s 中每个字符的出现频率。 步骤四:比较字符频率 接下来,遍历第二个字符串 t 。对于 t 中的每一个字符: 检查该字符是否存在于我们为字符串 s 创建的哈希表中。 如果字符不存在于哈希表中,说明 t 包含了一个 s 中没有的字符,可以直接返回 false 。 如果字符存在,则将该字符在哈希表中对应的计数减1。 在遍历完整个字符串 t 后,我们还需要进行最后一次检查:确认哈希表中所有字符的计数是否都已被减至0。 因为如果 s 和 t 是字母异位词,那么通过增加 s 的计数和减少 t 的计数,最终每个字符的净计数应该正好是0。 如果存在任何一个字符的计数不为0,则返回 false 。 如果所有计数均为0,则返回 true 。 步骤五:复杂度分析 时间复杂度:O(n)。我们进行了三次线性遍历:一次检查长度,一次遍历字符串 s ,一次遍历字符串 t (以及一次遍历有限的26个字母来检查计数,可视为常数时间)。因此总体时间复杂度是O(n)。 空间复杂度:O(1)。虽然我们使用了额外的哈希表空间,但由于字母数量是有限的(比如小写英文字母只有26个),哈希表的大小不会随着输入字符串的长度n而增长,因此空间复杂度是常数级的O(1)。