🥉Easy

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例 1:

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

示例 2:

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

说明:
你可以假设字符串只包含小写字母。

题解

题目很简单,但是一定要理解清楚什么是字母异位词,字母异位词指的是把原字符串内容顺序调换后的字符串。接下来就很简单了,把字符串转成数组,然后排序即可:

排序

Python

class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        if len(s)!=len(t):
            return False
        return sorted(list(s))==sorted(list(t))

JavaScript

var isAnagram = function(s, t) {
    return s.length == t.length && [...s].sort().join('') === [...t].sort().join('')
};

复杂度分析

  • 时间复杂度:🥉242. 有效的字母异位词 - 图1。其中 n 为 s 的长度。排序的时间复杂度为🥉242. 有效的字母异位词 - 图2 ,比较两个字符串是否相等时间复杂度为 🥉242. 有效的字母异位词 - 图3,因此总体时间复杂度为🥉242. 有效的字母异位词 - 图4
  • 空间复杂度:🥉242. 有效的字母异位词 - 图5。排序需要🥉242. 有效的字母异位词 - 图6 的空间复杂度。注意,在某些语言(比如 Java & JavaScript)中字符串是不可变的,因此我们需要额外的 🥉242. 有效的字母异位词 - 图7的空间来拷贝字符串。但是我们忽略这一复杂度分析,因为:
    • 这依赖于语言的细节;
    • 这取决于函数的设计方式,例如,可以将函数参数类型更改为 char[]。

      哈希表

      从另一个角度考虑,t 是 s 的异位词等价于「两个字符串中字符出现的种类和次数均相等」。由于字符串只包含 26 个小写字母,因此我们可以维护一个长度为 26 的频次数组 table,先遍历记录字符串 s 中字符出现的频次,然后遍历字符串 t,减去 table 中对应的频次,如果出现 table[i]<0,则说明 t 包含一个不在 s 中的额外字符,返回 false 即可。