【JavaScript版】Leetcode242:有效的字母异位词

LeetCode242:有效的字母异位词-给定两个字符串 s 和 t,编写一个函数来判断 t 是否是 s 的字母异位词。
  • 你可以假设字符串只包含小写字母。
  • 示例 1:
            输入: s = "anagram", t = "nagaram"
            输出: true
  • 示例 2
            输入: s = "rat", t = "car"
            输出: false
  • 字母异位词,也就是两个字符串中的相同字符的数量要对应相等。例如,s等于“anagram”,t等于“nagaram”,s和t就互为字母异位词。因为它们都包含有三个字符a,一个字符g,一个字符 m,一个字符 n,以及一个字符 r。而当 s 为 “rat”,t 为 “car”的时候,s 和 t 不互为字母异位词。
【解1】利用Array对象的sort( )方法,先将两个字符串数组排序,再比较重排后的数组是否相等。这个方法可以不用判断数组长度是否相同。
    function fun1(s,t){
        var sList = s.split("");
        var tList = t.split("");
        if(sList.sort().toString() == tList.sort().toString()){
            return true;
        }else{
            return false;
        }
    }    

 

【解2】(朴素的字母表)可以利用两个长度都为 26 的字符数组来统计每个字符串中小写字母出现的次数,然后再对比是否相等;
    function fun2(s,t){
        var sList = s.split("");
        var tList = t.split("");
        var arrayS = new Array(26).fill(0);
        var arrayT = new Array(26).fill(0);
        if(sList.length !== tList.length)
            return false;
        for(var i=0; i<sList.length; i++){
            arrayS[s.charCodeAt(i)-97] += 1;
            arrayT[t.charCodeAt(i)-97] += 1;
        }
        if(arrayS.toString() == arrayT.toString()){
            return true;
        }else{
            return false;
        }
    }

 

【解3】(朴素的字母表-升级)可以只利用一个长度为 26 的字符数组,将出现在字符串 s 里的字符个数加 1,而出现在字符串 t 里的字符个数减 1,最后判断每个小写字母的个数是否都为 0。
    function fun3(s,t){
        var arr = new Array(26).fill(0);
        if(s.length !== t.length)
            return false;
        for(var i=0; i<s.length; i++){
            arr[s.charCodeAt(i)-97] += 1;
            arr[t.charCodeAt(i)-97] -= 1;
        }
        if(!arr.some(item => item!==0)){
            return true;
        }else{
            return false;
        }
    }
// 改进版本
    function fun32(s,t){
        var arr = new Array(26).fill(0);
        if(s.length !== t.length)
            return false;
        var aCode = 'a'.charCodeAt(); // 这样就不用背码表了
        for(var i=0; i<s.length; i++){
            arr[s.charCodeAt(i)-aCode]++;
            arr[t.charCodeAt(i)-aCode]--;
        }
        if(arr.some(item => item!==0)){
            return false;
        }
        return true;
    }

 

 
【解4】(哈希表)使用ES6中的Map类型构建哈希表,创建数据结构为 Map 的 map 对象;遍历 s, 将各字母出现的次数叠加存储进 map 中;遍历 t, 在 map 中减少相应字母出现的个数, 并增加 map 中未收录的字母;如果最后 map 的 size 不为 0, 则 s 与 t 不是字母异位词;,否则是字母异位词。
这个版本的优点是 输入字符串包含 unicode 字符 也可以轻松应对,不然建一个与unicode码表一样长的数组也太可怕了。
    function fun3(s,t){
        var sList = s.split("");
        var tList = t.split("");
        var arr = new Array(26).fill(0);
        if(sList.length !== tList.length)
            return false;
        for(var i=0; i<sList.length; i++){
            arr[s.charCodeAt(i)-97] += 1;
            arr[t.charCodeAt(i)-97] -= 1;
        }
        if(!arr.some(item => item!==0)){
            return true;
        }else{
            return false;
        }
    }
    function fun4(s,t){
        const map = new Map();
        for(let i=0;i<s.length;i++){
            const getMap = map.get(s[i]);
            if(!getMap){
                map.set(s[i],1);
            }else{
                map.set(s[i], getMap+1);
            }
        }
        for(let i=0;i<t.length;i++){
            const getMap = map.get(t[i]);
            if(getMap === 1){
                map.delete(t[i]);
            }else if(getMap){
                map.set(t[i], getMap-1);
            }else{
                map.set(t[i], 1);
            }
        }
        if(map.size){
            return false;
        }else{
            return true;
        }
    }

 

 
posted @ 2020-03-05 16:37  兔子大叔  阅读(539)  评论(0编辑  收藏  举报