先来看看题目表述
从题目可知,所谓字母异位词就是将源单词内字母的打乱顺序后得到的新单词。 那这就意味着每个打乱后的新单词都会对应一个唯一的源单词。我们如果能够找到字符串数组中每个字符串对应的源单词,将相同源单词的字符串组成一个数组,也就能够得到结果列表了。但是问题是怎么才能获取一个字符串对应的源单词呢?
一个字符串对应的源单词是不唯一的,但是如果将所有可能的源单词进行排序,得到的排序后的源单词是唯一的!! 也就是我可以将每个字符串的字符进行排序,所有排序后相同的字符串就是字母异位词。最后将这些字母异位词输出就好啦!! 以下是我自己的实现过程:
/**
* @param {string[]} strs
* @return {string[][]}
*/
var groupAnagrams = function(strs) {
// 获取字符串数组长度
let length = strs.length
// 创建缓存对象
let map = new Map()
// 保存结果数组
let resArr= new Array()
// 遍历数组
strs.forEach(str=>{
// 将字符串排序
let sortedStr =str.split('').sort().join('')
// 判断排序后的字符串是否出现在缓存中
if(!map.has(sortedStr)){
// 若没有
// 将排序后的字符串以及对应缓存数组加入缓存对象中
map.set(sortedStr,new Array())
}
// 将当前字符串加入缓存数组中
map.get(sortedStr).push(str)
})
// 遍历缓存对象
map.forEach((value,key)=>{
// key 是排序后的字符串
// value 是对应的原始字符串数组集合
// 加入结果数组中
resArr.push(value)
})
// 返回结果数组
return resArr
};
感觉效果还不错??