携手创作,共同成长!这是我参与「掘金日新计划 · 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的转换的方法不常用,但是在用的时候会很好用
- 今天也是有收获的一天