AlgoMooc
你已开通华为OD训练营权益,还差最后一步——完成入营激活(兑换课程 + 加飞书 + 登记服务群),即可解锁全部课程与专属服务。去激活 →
← OD 20 天课程

华为 OD 训练营 · 题解精讲

LC242. 有效的字母异位词

LC242. 有效的字母异位词 视频地址。

题目描述

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 示例 1: 输入: s = "anagram", t = "nagaram" 输出: true 示例 2: 输入: s = "rat", t = "car" 输出: false 提示: 1 <= s.length, t.length <= 5 * 104 s 和 t 仅包含小写字母 进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

题目解析

题目讲的是让你判断两个字符串中的字母是否一致,比如 示例1 中,s 包含字母 a、n、g、r、m,而 t 中也包含 a、n、g、r、m ,都是只有这五个字母,并且 频次 相同,只是顺序不同。 看到 频次 这个词,你脑海中第一想法是什么? 没错,就是 哈希表 ! 解法思路很简单。 1、首先先判断两个字符串长度是否相同,不相同直接返回 false 2、然后把 s 中所有的字符出现个数使用 计数器 统计起来,存入一个大小为 26 的数组中(注意题目的说明) YxuAbPFcno1RcuxsN3IcMjnTnPb.png

3、最后再来统计 t 字符串,即遍历 t 时将对应的字母频次进行减少,如果期间 计数器 出现小于零的情况,则说明 t 中包含一个不存在于 s 中的字母,直接返回 false。 E5IFblyw8oFrcDxQdWqcxMxYnWc.png

4、最后检查计数器是否归零。

参考代码

参考代码

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        
        # 如果两个字符串的长度都不一致,那么肯定是无法成为字母异位词的
        if len(s) != len(t):
            # 直接返回 False
            return False

        # 让 a - z 这 26 个字母对应的下标变成 0 - 25 方便存到数组中
        # 比如 a 对应的索引就是 0 
        # b 对应的索引就是 1
        table = [0] * 26

        # 从头到尾遍历字符串 s
        for i in s:

            # 把访问的字符转换为整数的形式
            # 比如访问字母 a,那么 -'a' 之后就是 0,就是 a 对应的索引为 0 
            index = ord(i) - ord('a')

            # 那么意味着这个字母出现的频次需要加 1
            table[index] += 1


        for i in t:

            # 把访问的字符转换为整数的形式
            # 比如访问字母 a,那么 -'a' 之后就是 0,就是 a 对应的索引为 0 
            index = ord(i) - ord('a')

            # 那么意味着这个字母出现的频次需要减 1 
            table[index] -= 1

            # 如果说发现这个字母出现的频次小于了 0 
            # 说明 t 中出现了 s 中不曾用的字母
            if table[index] < 0 : 

                # 那就不是字母异位词
                return False


        # 否则,说明是字母异位词
        return True