[TOC]javascript
給定兩個字符串 s 和 t ,編寫一個函數來判斷 t 是不是 s 的字母異位詞。前端
示例 1:java
輸入: s = "anagram", t = "nagaram" 輸出: true
示例 2:git
輸入: s = "rat", t = "car" 輸出: false 說明: 你能夠假設字符串只包含小寫字母。
進階:
若是輸入字符串包含 unicode 字符怎麼辦?你可否調整你的解法來應對這種狀況?github
判斷異位詞的方法不少,能夠用哈希表,也能夠構建26個字符數組判斷,還能夠根據每一個字符出現的次數排序後判斷字符串是否相等數組
哈希,數組函數
哈希表在本題中表現通常,但看到這題時每每第一時間就能想到這個辦法.構建一個HashMap而後統計s中每一個單詞出現的次數,隨後用這個表去判斷第t中全部字符出現的次數,一旦字符出現的次數不相等或者沒有這個字符就返回false測試
構建一個長度爲26的數組而後所有填充0,隨後s中的s[i]
字符出現一次該下標位置的數字就自加一次,t[i]
對應的下標自減一次,最後的結果中有一個不爲0則表示s和t不相等code
和解法二思路相似,但其實就是排序後判斷字符串是否相等
/** * @param {string} s * @param {string} t * @return {boolean} */ var isAnagram = function (s, t) { // 哈希法 // if (s.length !== t.length) {return false;} // let map = new Map(); // for (let i = 0;i < s.length;i++) { // map.get(s[i]) === undefined ? map.set(s[i], 1) : map.set(s[i], map.get(s[i]) + 1); // } // for (let j = 0;j < t.length;j++) { // if (map.get(t[j]) > 0) {map.set(t[j], (map.get(t[j])) - 1);} else {return false;} // } // return true; // 26個字符法 if (s.length !== t.length) {return false;} let kmap = new Array(26).fill(0); for (let i = 0 ;i < s.length;i++) { kmap[s[i].charCodeAt(0) - 97]++; kmap[t[i].charCodeAt(0) - 97]--; } for (let i = 0;i < 26;i++) { if (kmap[i] !== 0) {return false;} } return true; // 解法三 // if (s.length !== t.length) return false // let o = new Array(26).fill(0) // for (let i = 0; i < s.length; i++) { // o[s[i].charCodeAt(0) - 97]++ // } // let p = new Array(26).fill(0) // for (let i = 0; i < t.length; i++) { // p[t[i].charCodeAt(0) - 97]++ // } // o = o.toString() // p = p.toString() // return o === p };
input:"rat","art" output:true
執行用時 :68 ms, 在全部 javascript 提交中擊敗了98.28%的用戶 內存消耗 :35.7 MB, 在全部 javascript 提交中擊敗了87.50%的用戶