242. 有效的字母异位词
一、排序
t 是 s 的异位词等价于「两个字符串排序后相等」。因此我们可以对字符串 s 和 t 分别排序,看排序后的字符串是否相等即可判断。此外,如果 s 和 t 的长度不同,t 必然不是 s 的异位词。
var isAnagram = function(s, t) {
// 1、调用sort进行排序,是针对数组。所以需要将字符串转换成数组形式
// 2、对于排序之后的比较,如果使用==进行比较,需要将数组中的元素连接成字符串
return s.length == t.length && [...s].sort().join('') == [...t].sort().join('')
};
二、哈希表
1、定义一个数组叫做record用来上记录字符串s里字符出现的次数。需要把字符映射到数组也就是哈希表的索引下标上,因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25。所以需要将 s[i] - ‘a’ 所在的元素做+1 操作即可,并不需要记住字符a的ASCII,只要求出一个相对数值就可以了。 这样就将字符串s中字符出现的次数,统计出来了。 2、在遍历字符串t的时候,对t中出现的字符映射哈希表索引上的数值再做-1的操作。最后检查一下,record数组如果有的元素不为零0,说明字符串s和t一定是谁多了字符或者谁少了字符,return false。
var isAnagram = function(s, t) {
// 1、检查长度,长度不相等也不相等
if(s.length != t.length) return false
// 维护一个长度为26的数组,用于存放26个字母对应的数量。
// 由于"a"的ASCII为97,所以之后的字母都可以以它为标准,求相对位置
const base = "a".charCodeAt()
const list = new Array(26).fill(0)
for(let i of s){
// 遍历字符串,每遍历一个在对应的位置上加1
list[i.charCodeAt() - base]++
}
for(let j of t){
// 要先减去对应的值,然后再看是否有小于0的部分
list[j.charCodeAt() - base]--
// 如果数组当中有数值小于0,那么就不是
if(list[j.charCodeAt() - base] <0){
return false
}
}
return true
};