一起刷LeetCode——字母异位词分组(Map)

63 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情

字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

来源:力扣(LeetCode) 链接:leetcode.cn/problems/gr…

分析

  • 如果对字母异位词感到陌生,可以先做一下有效的字母异位词,意思就是两个字符串包含的字母相同
  • 所以一组字母异位词中包含的字母是相同的,通过这个特点来得到结果

排序

  • 如果同一组包含的字母相同,那么在对字符串排序后得到的字符串是相等的,如果要根据某个特性分组,可以比较容易想到使用Map,键值对的方式来管理,键统一用有序的字符串,值就是结果中的组
  • 需要熟练使用Map相关的方法
    • 构造方法:new Map
    • 设置键值对:set(key,value)
    • 获取key对应的value值:get(val)
    • 是否有key值:has(key)
    • 所有的键:keys()
    • 所有的值:values()
代码
/**
 * @param {string[]} strs
 * @return {string[][]}
 */
var groupAnagrams = function(strs) {
    let map = new Map()
    for(let i=0;i<strs.length;i++) {
        let key = strs[i].split('').sort().toString()
        let list = map.get(key)?map.get(key):[]
        list.push(strs[i])
        map.set(key, list)
    }
    return Array.from(map.values())
};

特征值

  • 就字母异位词这个角度来看,每个单词的特征就是26个字母分别出现了多少次,因此,可以通过遍历单词数组,来计算每个单词的特征,相同特征的属于一个组,用Map管理起来。键值对中的键可以是26个字母出现的次数,每个字母出现的次数可以通过一个长度为26的数组,下标0-25分别表示a-z,值则是出现次数
  • 有点神奇的是:使用Map会报超时,使用Object就可以AC
代码
/**
 * @param {string[]} strs
 * @return {string[][]}
 */
var groupAnagrams = function(strs) {
    const map = new Object();
    for (let i=0;i<strs.length;i++) {
        const key = new Array(26).fill(0);
        let str = strs[i]
        for (let j=0;j<str.length;j++) {
            key[str[j].charCodeAt() - 'a'.charCodeAt()]++;
        }
        map[key] ? map[key].push(s) : map[key] = [s];
    }
    return Object.values(map);
};

总结

  • 当题目中对有某些特征值一样的数据分组的时候,可以选择使用Map或者是键值对的思想来解题
  • Map的方法以及和Array的转换的方法不常用,但是在用的时候会很好用
  • 今天也是有收获的一天