【算法06天:Day6】第三章哈希表 LeetCode 有效的字母异位词(242)

63 阅读2分钟

题目一:

image.png

解法一:(排序后判相等)

解题思路:这个题我想的思路就是,将两个字符串转为数组,然后进行排序,最后判断两个排序后的数组每个元素是否相等。这里需要注意的是,最后不能直接判断两个数组是否相等,而是应该判断两个数组中每个字符是否相等。可以先判断两个字符串的长度是否相等,不相等直接返回false。

t 是 ss 的异位词等价于「两个字符串排序后相等」。因此我们可以对字符串 ss 和 tt 分别排序,看排序后的字符串是否相等即可判断。此外,如果 ss 和 tt 的长度不同,tt 必然不是 ss 的异位词。

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

image.png

解法二:(统计次数判相等)

解题思路:可以把s字符串中每个字符出现的次数统计出来,然后再检查字符串t中是否出现了这些字符,在遍历字符串t时,对原先s中统计结果对应位置的次数-1,最后检查统计次数的数组,是否有不为0的元素,有的元素不为零0,说明字符串s和t一定是谁多了字符或者谁少了字符,return false。

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

image.png

总结:字符的ascii码值,可以使用字符串原生函数charCodeAt(),记住这是一个函数,a的ascii码值为97。遍历字符串可以使用 for (const i of s)。

解法三:(map)

解题思路:其实最开始我就是想用map来实现的,代码有点卡壳,写了其他的之后,后来就会写了。

用map解决,s,t为异位词,t中的元素必定存在s中,只是位置不同而已,利用map进行遍历判断:

1、建立一个s字符串的Map,每一个元素设置键值1,重复出现的元素键值+1

2、遍历判断t中的元素在s中是否有且键值大于0(大于零表示存在的)

3.每找到一个元素,其键值-1(用于标记其已经被找过了,下次对比不找它了)

image.png

总结:map中判断是否含有某个元素使用has(),获取某个元素get(key),设置某个元素,set(key, value)。