剑指Offer|LCR 033.字母异位词分组

LCR 033.字母异位词分组

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

**注意:**若两个字符串中每个字符出现的次数都相同,则称它们互为变位词。

示例 1:

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

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

提示:

  • 1 <= strs.length <= 104
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

法1:

分析:

使用质数映射a-z,这样每个字符串对应的质数相乘的数便是唯一的,把这个数作为map的键,如果map存在键,直接push该字符串,否则添加键和空值。

最后结果返回map.values()

var groupAnagrams = function(strs) {
    // 质数映射,使用字符'a'到'z'的质数值
    const hash = [
        2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 
        43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101
    ];

    const groups = new Map();

    for (let str of strs) {
        let wordHash = 1;
        for (let i = 0; i < str.length; ++i) {
            wordHash *= hash[str.charCodeAt(i) - 'a'.charCodeAt(0)];
        }

        // 如果没有这个wordHash的键,则初始化一个新的数组
        if (!groups.has(wordHash)) {
            groups.set(wordHash, []);
        }
        groups.get(wordHash).push(str);
    }

    // 返回所有分组的数组
    return Array.from(groups.values());
};

法2:

分析:

与法1不同,这里是对字符串先转为单个字母的数组,然后排序,最后再转为字符串,将这个字符串作为map的键。

var groupAnagrams = function(strs) {
    const groups = new Map();

    for (let str of strs) {
        // 将字符串转换为字符数组并排序
        let charArray = str.split('');
        charArray.sort();
        let sorted = charArray.join('');

        // 如果Map中没有该排序后的字符串,初始化一个新的数组
        if (!groups.has(sorted)) {
            groups.set(sorted, []);
        }
        groups.get(sorted).push(str);
    }

    // 返回所有分组的数组
    return Array.from(groups.values());
};

你可能感兴趣的:(剑指Offer,算法,javascript,算法)