字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
1 <= strs.length <=
10410^41040 <= strs[i].length <= 100
strs[i]
仅包含小写字母
思路分析
方法一
- 字母异位词排序后,所得到的的字符串一定是相同的;
- 因此,我们可以使用排序后的字符串作为
key
值,然后将所存在的字母异位词组成数组当作对应key
值的value
值; - 定义一个字符串排序方法
sortString
,此处使用的是先将字符串转换成数组,然后数组排序,最后再组合成字符串的方式; - 定义一个空对象
map
,使用sortString(item)
后的值作为key
,若存在则将item
push
到数组中,若不存在,则使用item
,构建一个数组去赋值; - 最后返回
Object.values(map)
即可。
方法二
- 字母异位词中每个字母出现的次数一定是相同的;
- 因此,我们可以使用每个字母统计次数后的数据作为 key 值,然后将所存在的字母异位词组成数组当作对应
key
值的value
值; - 因为只含有小写字母,所以可以定义一个长度为26的字符串来统计每个字母出现的次数,然后将对应的字符串存入map中;
- 最后返回
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