likes
comments
collection
share

LeetCode.242 有效的字母异位词

作者站长头像
站长
· 阅读数 10

题目描述:

242. 有效的字母异位词 - 力扣(LeetCode) (leetcode-cn.com)

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

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例一

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

示例二

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

提示:

  • 1<=s.length,t.length<=5∗1041 <= s.length, t.length <= 5 * 10^41<=s.length,t.length<=5104
  • st 仅包含小写字母  

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

思路分析

排序

由题目可知,若两个string是异位词,则他们包含的字母是相等的,只是顺序不同而已,所以我们字符串转数组然后排序就行了~

AC代码

class Solution {
    fun isAnagram(originString: String, destString: String): Boolean {
        if (originString.length != destString.length) return false

        val originCharArray = originString.toCharArray()
        val destCharArray = destString.toCharArray()
        
        originCharArray.sort()
        destCharArray.sort()
        return originCharArray.contentEquals(destCharArray)
    }
}

哈希表

用哈希表的话解法有好几种,说个简单的,由题目可知,若两个string是异位词,则他们包含的字母是相等的,所以我们只要统计出string中各个字母的个数存到哈希表中,然后比较下两个哈希表就行了~

AC代码

class Solution {
    fun isAnagram(s: String, t: String): Boolean {
     var m1 = mutableMapOf<Char,Int>()
     var m2 = mutableMapOf<Char,Int>()
     
     s.toCharArray().forEach{
         var value=m1[it]?:0
         m1[it] = ++value 
     }
     
     t.toCharArray().forEach{
         var value=m2[it]?:0
         m2[it] = ++value 
     }
     return m1==m2
    }
}

这是2个维护2个哈希表的情况,还可以维护一个哈希表,第一个让里面加,第二个减,如果是异位词,那么最后这个哈希表肯定是空的~,这个也比较简单,代码就不贴了。

总结

这题还是比较简单的,一遍AC,但是这题有个进阶问题,需要了解 Unicode 相关编码的问题,这个解法等我研究下再来补充。

参考

有效的字母异位词 - 有效的字母异位词 - 力扣(LeetCode) (leetcode-cn.com)

242.有效的字母异位词 - 有效的字母异位词 - 力扣(LeetCode) (leetcode-cn.com)