題目描述
給定一個字符串數組,將字母異位詞組合在一起。字母異位詞指字母相同,但排列不同的字符串。
示例:
輸入:[“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
輸出:
[
[“eat”, “tea”, “ate”],
[“tan”, “nat”],
[“bat”]
]
說明:
所有輸入均爲小寫字母。
不考慮答案輸出的順序。
思路分析
此題主要考察對字典操作的應用。ES6中引入了MAP數據解構,我們用它來解這道題目。
算法流程:確定單詞所包含字母組合——搜索是否已在字典中——是,放入對應鍵下;否,創造新的鍵,並賦值。
js代碼
function merge(arr) {
let m = new Map();
arr.forEach(item => {
let key = item.split('').sort().join('');
if(m.has(key)){
let value = m.get(key);
[].push.call(value, item);
}
else{
m.set(key, [item]);
}
});
return Array.from(m.values());
}
let input = ["eat", "tea", "tan", "ate", "nat", "bat"];
let output = merge(input);
console.log(output);
控制檯打印結果如下:
這裏需要注意兩點:
- 存儲在MAP結構中的值雖然像數組,但是沒有數組的方法,所以需要通過call方法來爲其添加元素。
- MAP結構中的值是數組,引用類型,所以直接爲value添加元素即可,不需要再使用set方法。