🌈【LeetCode.49 字母异位词分组】- JavaScript =>hash+排序

350 阅读2分钟

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


题意描述

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母都恰好只用一次。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"] 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

思路1:构建hash表

分析:根据hash的思想,我们将每个子串使用质数乘法进行hash,只要两个字符串包含的字符与对应数量一致,hash结果则一致。

'abc' = 2*3*4'acb' = 2*4*3 利用构建哈希表保存记录,直接读取。

var groupAnagrams = function (strs) {
let n = strs.length;
let ans = new Map();
const prime = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103];
let mod = 1e9 + 7;
for (let i = 0; i < n; i++) {
    let hash = 1;
    for (let j = 0; j < strs[i].length; j++) {
        let num = strs[i].charCodeAt(j) - 97;
        hash = ((hash % mod) * (prime[num] % mod)) % mod;
    }
    if (!ans.get(hash)) ans.set(hash, []);
    ans.get(hash).push(strs[i]);
}
return [...ans.values()];
};
思路2:排序

步骤

  1. compareArr 放置排序后的不同字符串元素

  2. 遍历数组,获取当前字符串升序排列后的结果

  3. 获取在compareArr中的索引

  4. 如果是-1时,表示未出现过,compareArr追加结果字符串

    result则增加新的子元素数组,数组内部元素为当前字符串

  5. 如果非-1时,在result对应位置的子数组中追加当前字符串

 var groupAnagrams = function(strs) {
    let result = [], // 结果数组
        compareArr = []; // 用以比较的字符串数组
    strs.forEach(item => {
        // 获取当前字符串 => 按字母升序排列后的字符串
        let cur = item.split('').sort((a, b) => a.localeCompare(b)).join(''),
             // 获取在比较字符串数组中的索引
            index = compareArr.indexOf(cur);
        if(index === -1) { // 未出现过
            compareArr.push(cur); // 比较字符串增加
            result.push([item]); // 结果数组末尾增加
        } else { // 出现过
            result[index].push(item); // 在给定位置的子数组中继续追加
        }
    })
    return result;
};

感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤