哈希算法题目:有效的字母异位词
字数 1086 2025-10-25 19:16:30
哈希算法题目:有效的字母异位词
题目描述:给定两个字符串 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)。