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