242. 有效的字母异位词 JavaScript实现

342 阅读2分钟

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
};