「这是我参与2022首次更文挑战的第29天,活动详情查看:2022首次更文挑战」。
题目
给你一个字符串数组,请你将 字母异位词
组合在一起。可以按任意顺序返回结果列表。
字母异位词
是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例1
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例2
输入: strs = [""]
输出: [[""]]
示例3
输入: strs = ["a"]
输出: [["a"]]
思路
这道题的关键需要理解题目的意思,什么是 字母异位词
,简单来说就是由相同字母及相同个数组成的不同单词;例如:eat
、aet
,是一组 字母异位词
,因为它们都是由相同数量的字母 e、a、t
组成的不同单词。理解了题目的意思,那么解题思路就很清晰了,关键就在于区分两个单词,是不是属于同一组 字母异位词
,步骤如下:
-
定义
字母异位词
的标识为单词所有字符,按Unicode
编码,从小到大排列的字符串 -
定义一个函数
getStrNum
,接收一个单词参数,返回这个单词所属的字母异位词
组标识 -
定义
ansMap
为Object
结构,存放字母异位词
组 -
遍历题目所给字符串数组
-
利用
getStrNum
函数,判断当前字符串的标识
-
将当前字符串放入
ansMap
对应的字母异位词组
数组中ansMap[strNum].push(strs[i])
-
-
将
ansMap
中所有的value
放入数组中返回,即为题目所求
代码如下
/**
* @param {string[]} strs
* @return {string[][]}
*/
var groupAnagrams = function(strs) {
let ansMap = {}, ansArr = [];
const getStrNum = str => {
return str.split('').sort((a, b) => a.charCodeAt() - b.charCodeAt()).join('');
}
for(let i = 0; i < strs.length; i++) {
let strNum = getStrNum(strs[i]);
if(!ansMap[strNum]) {
ansMap[strNum] = [];
}
ansMap[strNum].push(strs[i]);
}
Object.keys(ansMap).forEach(key => {
ansArr.push(ansMap[key]);
})
return ansArr;
};
小结
读懂题目的意思,才能更好的处理问题
LeetCode 👉 HOT 100 👉 字母异位词分组 - 中等题 ✅
合集:LeetCode 👉 HOT 100,有空就会更新,大家多多支持,点个赞👍
如果大家有好的解法,或者发现本文理解不对的地方,欢迎留言评论 😄