字母异位词分组

172 阅读1分钟

先来看看题目表述

image.png

从题目可知,所谓字母异位词就是将源单词内字母的打乱顺序后得到的新单词。 那这就意味着每个打乱后的新单词都会对应一个唯一的源单词。我们如果能够找到字符串数组中每个字符串对应的源单词,将相同源单词的字符串组成一个数组,也就能够得到结果列表了。但是问题是怎么才能获取一个字符串对应的源单词呢?

一个字符串对应的源单词是不唯一的,但是如果将所有可能的源单词进行排序,得到的排序后的源单词是唯一的!! 也就是我可以将每个字符串的字符进行排序,所有排序后相同的字符串就是字母异位词。最后将这些字母异位词输出就好啦!! 以下是我自己的实现过程:

/**
 * @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
};

感觉效果还不错??

image.png