正题
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram"
输出: true
示例 2:
输入: s = "rat", t = "car"
输出: false
先上代码:
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
return s.split('').sort((a,b) => {return a.charCodeAt() - b.charCodeAt()}).join() === t.split('').sort((a,b) => {return a.charCodeAt() - b.charCodeAt()}).join()
};
乍一看代码虽然只有一行,但是很长,咱们可以慢慢解析。
核心思想:转成升序字符串,比较是否相同
首先拆解等号前面部分
s.split('').sort((a,b) => {return a.charCodeAt() - b.charCodeAt()}).join()
入参 s 和 t皆为字符串,第一步使用 split 函数将字符串转化为字符串数组
到这将 s 转化为数组,但是数组并不能比较是否字母相同。我们必须按照一定规则给他们排序,那么只要左右两边都按照这个规则给他排序,如果相同的话,那么我们可以认为这个是 有效的字母异位词
第二步,使用数组 sort 方法进行排序,排序的条件是 charCodeAt() 升序
charCodeAt函数: 返回字符串第一个字符的 Unicode 编码(H 的 Unicode 值)
图为: Unicode 编码表
将每个字符用数字量化,那么就可以将每个字符进行排序了。排序之后,数组内的字符会按照对应编码表的顺序升序排列!
第三步,将字符串数组转回字符串,为什么要这么做?
好比较!
左右两边对 s 和 t 做同样的操作后,直接使用 === 号比较,比较的结果就是是否为 有效的字母异位词的结果了!