LeetCode 242. 有效的字母异位词

480 阅读1分钟

leetcode.cn/problems/va…

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

 

示例 1:

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

示例 2:

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

 

提示:

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

 

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

解法一:

使用两个 Map 记录每个字符出现的次数,然后比较。

class Solution {
    fun isAnagram(s: String, t: String): Boolean {
        val sMap = mutableMapOf<Char, Int>()
        val tMap = mutableMapOf<Char, Int>()

        s.forEach {
            sMap[it] = (sMap[it] ?: 0) + 1
        }

        t.forEach {
            tMap[it] = (tMap[it] ?: 0) + 1
        }

        return sMap == tMap
    }
}

解法二:

对两个字符串进行排序,然后比较。

class Solution {
    fun isAnagram(s: String, t: String): Boolean {
        var sList = s.toList()
        var tList = t.toList()
        
        sList = sList.sorted()
        tList = tList.sorted()

        return sList==tList
    }
}

解法三:

我们先判断两个字符串长度是否相同,不相同直接返回false。然后把s中所有的字符出现个数统计起来,存入一个大小为26的数组中,因为题目中限定了输入字符串为小写字母组成。然后我们再来统计t字符串,如果发现不匹配则返回false。 参见代码如下:

class Solution {
    fun isAnagram(s: String, t: String): Boolean {
        if (s.length != t.length) {
            return false
        }

        val array: IntArray = IntArray(26) { 0 }
        s.withIndex().forEach {
            array[it.value - 'a']++
        }

        t.withIndex().forEach {
            if (--array[it.value - 'a'] < 0) {
                return false
            }
        }
        return true
    }
}