zoukankan      html  css  js  c++  java
  • 【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;
            }
        }
     
  • 相关阅读:
    远程服务器git搭建
    Ubuntu安装配置MySQL数据库,Apache,PHP
    html radio check
    opencv 抠图联通块(c接口)
    Vim命令
    二维码
    zTree Jquery eCharts
    Java进阶篇设计模式之二 ----- 工厂模式
    SpringBoot整合Netty并使用Protobuf进行数据传输(附工程)
    SpringBoot整合Jsp和Thymeleaf (附工程)
  • 原文地址:https://www.cnblogs.com/chri330dj/p/12421025.html
Copyright © 2011-2022 走看看