[JS] 字母異位詞分組與JS中對象鍵值特性
題目地址:LeetCode 49. 字母異位詞分組
原題
給你一個字符串數(shù)組,請你將 字母異位詞 組合在一起。可以按任意順序返回結(jié)果列表。
字母異位詞 是由重新排列源單詞的所有字母得到的一個新單詞。
示例 1:
輸入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"] 輸出: [["bat"],["nat","tan"],["ate","eat","tea"]]示例 2:
輸入: strs = [""] 輸出: [[""]]示例 3:
輸入: strs = ["a"] 輸出: [["a"]]提示:
1 <= strs.length <= 1040 <= strs[i].length <= 100strs[i]僅包含小寫字母
這道題是一道經(jīng)典的哈希表應(yīng)用題,哈希表在這道題里面有兩個應(yīng)用:
- 對于一個單詞,建立字母到字母出現(xiàn)次數(shù)的映射;
- 對于題目給定的單詞數(shù)組,需要建立一個 特殊值 到單詞組的映射;
其中的 特殊值 應(yīng)該滿足由單詞計算得到,且不同的字母異位詞的 特殊值 是相同的。
官方題解
/**
* @param {string[]} strs
* @return {string[][]}
*/
var groupAnagrams = function(strs) {
const map = new Object();
for (let s of strs) {
const count = new Array(26).fill(0);
for (let c of s) {
count[c.charCodeAt() - 'a'.charCodeAt()]++;
}
map[count] ? map[count].push(s) : map[count] = [s];
}
return Object.values(map);
};
第一層循環(huán)遍歷的是詞組里的單詞。
for(let s of strs){
const count = new Array(26).fill(0);
...
}
一開始我很疑惑,因為對于每一個單詞,都新建了一個獨立的count來計算這個單詞中各個字母出現(xiàn)的次數(shù)。
這里的count就是上文說到的特殊值,用來判斷字母異位詞。
在一個單詞遍歷完所有字母后,count計算完畢,通過
map[count] ? map[count].push(s) : map[count] = [s];
將 特殊值 相同的單詞分為一組。
我的困惑是每次的count都是新建的數(shù)組,每個單詞的 特殊值 不同,每個單詞都會單獨成組。
但事實是:
JS 對象特性
根據(jù) JS 的語言特性,對象的key只能是字符串或者Symbol類型。
count作為數(shù)組類型,在被當作對象的key使用時,會進行隱式數(shù)據(jù)類型轉(zhuǎn)換,被轉(zhuǎn)換為一個字符串。
于是,只要有一些單詞的字母計數(shù)一樣,那么它們的count “序列化” 成字符串之后就是相等的。因此,可以被正確地分為一組。
測試
在 Node.js 中測試,使用一個數(shù)組作為對象的key來創(chuàng)建一個鍵值對,輸出對象的keys發(fā)現(xiàn)自動被轉(zhuǎn)換成字符串了。

浙公網(wǎng)安備 33010602011771號