49, 字母异位词分组
题目
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
输入: strs = [""]
输出: [[""]]
输入: strs = ["a"]
输出: [["a"]]
题解
思路:
1,使用计数方式,声明一个26个英文字母的数组,对每一个字符串进行计数,转换成一个字符串
2,在使用一个map,将第一步生成的字符串作为一个键名,存在map中,一个空数组作为一个键值
3,在循环每一个字符串的时候,在map中查找,是否有同一个字符串。
/**
思路:
1,使用计数方式,声明一个26个英文字母的数组,对每一个字符串进行计数,转换成一个字符串
2,在使用一个map,将第一步生成的字符串作为一个键名,存在map中,一个空数组作为一个键值
3,在循环每一个字符串的时候,在map中查找,是否有同一个字符串。
*/
var groupAnagrams = function(strs) {
// 声明一个map
let map = new Map()
// 循环遍历字符串数组
for(let i = 0; i < strs.length;i++){
// 拿到当前的字符,并且声明一个26位的数组
let currStr = strs[i], currArr = new Array(26).fill(0)
// 循环遍历该字符,填充数组,主要的方式就是填充数组
for(let j = 0;j < currStr.length;j++){
let k = currStr[j].charCodeAt() - 'a'.charCodeAt()
currArr[k] += 1
}
// 将计数数组转换成一个字符串
let str = currArr.toString()
// 判断map中是否有该字符串
// 如果有就将该字符串存在map的值数组中
// 如果没有,就创建一个新的键,并且将数组作为该键名的键值
if(map.has(str)){
map.set(str,[...map.get(str),currStr])
}else{
map.set(str,[currStr])
}
}
return Array.from(map.values())
};