原文:49. 字母异位词分组(力扣 面试题) - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/leetcode/leetcode-javascript-solution-049/

题目:

难度:Middle

相关话题:哈希表字符串

给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。

示例:

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

说明:

  • 所有输入均为小写字母。

  • 不考虑答案输出的顺序。


思路:

查看2个异位词最直接的办法就是排序,这里对每一个单词进行排序,再用hash保存,发现相同的说明是异位词, 时间复杂度是O(NKlogK),其中N是单词列表长度,K是每个单词的长度。

另一种办法对每一个单词构建一个26位数组,里面存放每一个字母在当前单词中出现的次数,

例如:aabcab,对应的数组就是[3,2,1,0,0,0,...]

序列化该数组后,保存到hash,发现相同的说明就是异位词。

第二种方法时间复杂度是O(NK)

/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * @param {string[]} strs
 * @return {string[][]}
 */
var groupAnagrams = function(strs) {
  let collect={},result=[]
  for(let i=0;i<strs.length;i++){
    let sorted=strs[i].split('').sort().join('')
    if(!collect[sorted])collect[sorted]=[strs[i]]
    else collect[sorted].push(strs[i])
  }
  for(let k in collect){
    result.push(collect[k])
  }
  return result
};