字母异位词分组

力扣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()]
}
上次更新:: 2024/1/16 11:26:08