有效的字母异位词

标签: 哈希表 字符串 排序

难度: Easy

给定两个字符串 st ,编写一个函数来判断它们是不是一组变位词(字母异位词)。

注意:若 st 中每个字符出现的次数都相同且字符顺序不完全相同,则称 st 互为变位词(字母异位词)。

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false

示例 3:

输入: s = "a", t = "a"
输出: false

提示:

  • 1 <= s.length, t.length <= 5 * 104
  • s and t 仅包含小写字母

进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

注意:本题与主站 242 题相似(字母异位词定义不同):https://leetcode-cn.com/problems/valid-anagram/

Submission

运行时间: 31 ms

内存: 16.0 MB

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        if s == t:
            return False
        arr_s,arr_t = [0]*26,[0]*26
        for i in s:
            arr_s[ord(i) - ord("a")] += 1
        for i in t:
            arr_t[ord(i) - ord("a")] += 1
        return arr_s == arr_t

Explain

该题解采用了计数方法来判断两个字符串是否互为字母异位词。首先,检查两个字符串是否完全相同,如果相同,则根据题目要求它们不能算作字母异位词,直接返回 false。若不相同,进一步进行字母频次的统计。题解中使用了两个长度为26的数组 arr_s 和 arr_t 来分别统计字符串 s 和 t 中各字母的出现次数(考虑到只有小写字母,所以数组长度为26)。通过遍历字符串 s 和 t,对应增加 arr_s 和 arr_t 中的计数。最终,比较两个数组是否相等,相等则表明 s 和 t 是字母异位词,返回 true,否则返回 false。

时间复杂度: O(n + m)

空间复杂度: O(1)

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        # 如果s和t完全相同,则根据题意不是字母异位词
        if s == t:
            return False
        # 初始化两个长度为26的数组,用于计数
        arr_s, arr_t = [0]*26, [0]*26
        # 计算s中每个字符的出现频率
        for i in s:
            arr_s[ord(i) - ord('a')] += 1
        # 计算t中每个字符的出现频率
        for i in t:
            arr_t[ord(i) - ord('a')] += 1
        # 如果两个数组相等,则s和t是字母异位词
        return arr_s == arr_t

Explore

首先检查两个字符串是否完全相同是为了满足题目中的特殊要求,即两个字符串在互为字母异位词时,它们的字符顺序不能完全相同。如果两个字符串完全相同,尽管它们的字符出现次数相同,但因为顺序也相同,根据题目定义,它们不应该被认为是字母异位词。这一检查帮助快速排除这种情况,避免进行不必要的后续计算。

使用两个固定长度的数组(每个长度为26)来统计字符频率,相对于使用哈希表,具有空间效率高和访问速度快的优势。数组允许直接通过索引访问,操作速度通常快于哈希表,并且因为数组是连续存储的,它的空间局部性更好,可以更有效地利用缓存。然而,这种方法的劣势在于它仅限于已知范围的字符(如题目中的小写字母)。对于字符种类更多的情况,这种方法可能就不适用了,而哈希表在处理动态和更广泛的字符集时更为灵活。

如果字符串中包含了除小写字母以外的字符,当前使用固定长度数组的方法就不再适用。为适应这种情况,可以修改算法为使用哈希表来统计每个字符串中字符的出现次数。哈希表能够动态地处理各种字符,不受字符类型的限制。在这种方法中,每个字符都被用作哈希表的键,与其出现次数(值)相关联。这种修改使算法能够灵活应对包含各种字符的字符串,同时依然能够有效地比较两个字符串中字符的出现频率是否相同。