字母异位词分组
力扣49-字母异位词分组 (opens new window)
本题的核心在于如何设计哈希表的键。字母异位词是具有相同的字母且字母出现次数都一致的词,哈希表的键要设计成一个字母异位词可以经过简单运算得到的样子。
第一种想法是排序。因为字母在计算机中天生就是有顺序的,所以可以对遍历到的每个字符串按相同规则进行排序,排序之后的结果会作为哈希表的键,也是后续判断字母异位词的标准。因为字母异位词在经过排序之后的结果一定是相同的。
function groupAnagrams(strs) {
const map = new Map()
for (let i = 0; i < strs.length; i++) {
// 将每个遍历到的字符串进行排序
let str = strs[i].split('').sort().join()
// 排序之后的结果作为哈希表的键
if (map.has(str)) {
let temp = map.get(str)
temp.push(strs[i])
map.set(str, temp)
} else {
map.set(str, [strs[i]])
}
}
return [...map.values()]
}
另一种方法来自于判断有效的字母异位词(需先判断字符串长度,但是本题不用)时候的思路。用数组记录字符串中每个字母出现的次数,将该数组作为哈希表的键。原理也是因为字母异位词中单个字母出现的次数总是一致的。
function groupAnagrams(strs) {
const map = new Map()
for (let i = 0; i < strs.length; i++) {
let record = new Array(26).fill(0)
for (const s of strs[i]) {
record[s.charCodeAt() - "a".charCodeAt()]++
}
let key = record.join()
if (map.has(key)) {
let temp = map.get(key)
temp.push(strs[i])
map.set(key, temp)
} else {
map.set(key, [strs[i]])
}
}
return [...map.values()]
}