LeetCode 热题 HOT — 字母异位词分组

字母异位词分组

原题地址

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

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

思路分析

方法一

  1. 字母异位词排序后,所得到的的字符串一定是相同的;
  2. 因此,我们可以使用排序后的字符串作为 key 值,然后将所存在的字母异位词组成数组当作对应 key 值的 value 值;
  3. 定义一个字符串排序方法 sortString,此处使用的是先将字符串转换成数组,然后数组排序,最后再组合成字符串的方式;
  4. 定义一个空对象 map,使用 sortString(item) 后的值作为 key,若存在则将 item push 到数组中,若不存在,则使用 item,构建一个数组去赋值;
  5. 最后返回 Object.values(map) 即可。

方法二

  1. 字母异位词中每个字母出现的次数一定是相同的;
  2. 因此,我们可以使用每个字母统计次数后的数据作为 key 值,然后将所存在的字母异位词组成数组当作对应 key 值的 value 值;
  3. 因为只含有小写字母,所以可以定义一个长度为26的字符串来统计每个字母出现的次数,然后将对应的字符串存入map中;
  4. 最后返回 Object.values(map) 即可。

AC 代码

方法一

/**
 * @param {string[]} strs
 * @return {string[][]}
 */
var groupAnagrams = function(strs) {
    const map = { }
    strs.forEach(item => {
        if(map[sortString(item)]) {
            map[sortString(item)].push(item)
        } else {
            map[sortString(item)] = [item]
        }
    })
    return Object.values(map)
};

var sortString = function(str) {
    return str.split('').sort().join('')
} 

结果:

  • 执行结果: 通过
  • 执行用时:132 ms, 在所有 JavaScript 提交中击败了27.20%的用户
  • 内存消耗:51.5 MB, 在所有 JavaScript 提交中击败了38.50%的用户
  • 通过测试用例:115 / 115

方法二

/**
 * @param {string[]} strs
 * @return {string[][]}
 */
var groupAnagrams = function(strs) {
    const map = {}
    strs.forEach(item => {
        const count = new Array(26).fill(0)
        for (let c of item) {
            count[c.charCodeAt() - 'a'.charCodeAt()]++
        }
        if(map[count]) {
            map[count].push(item)
        } else {
            map[count] = [item]
        }
    })
    return Object.values(map)
}; 

结果:

  • 执行结果: 通过
  • 执行用时:144 ms, 在所有 JavaScript 提交中击败了17.48%的用户
  • 内存消耗:51.7 MB, 在所有 JavaScript 提交中击败了33.16%的用户
  • 通过测试用例:115 / 115

END

你可能感兴趣的:(leetcode,算法,职场和发展)