LeetCode49.字母异位分组
题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/group-anagrams
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
解题思路
通过题目描述不难发现,分为一组的单词其组成的字母一样,只是其位置不同,既然如此,我们只需要将它们的顺序调成一样的,那么就可以很容易分组,在这里我们通过排序,可以将它们的顺序调成一样,调成一样后有多种做法,可以比较字符串是否一致,来做,但是这样多次循环。
这里,可以通过JavaScript中的集合来做,通过建立一个map集合,将排序后的字符串作为键,原字符作为值,最后然后分组后的结果。
代码实现
var groupAnagrams = function(strs) {
let map = new Map();
strs.forEach((str) => {
const key = str.split("").sort().join("");
map.has(key) ? map.get(key).push(str) : map.set(key, [str]);
});
console.log(map)
return Array.from(map.values());
};
代码分析
由于使用的很多的内置函数,这个代码看起来十分的简短。
我们来分析一下这个代码的实现过程吧
通过forEach遍历每一个元素
split方法将数组中的每一个字符串分隔成单个字符,返回的是一个数组。
sort是排序函数,它通过ASCII码值排序
join是将它转化成字符串,相当于split的逆操作
最后通过三目运算符将排序后的字符串最为键,如果map中存在这个键了,那就说明它是一个组的,如果不存在,就将原字符串以数组的形式作为值存入map中。
from() 方法用于通过拥有 length 属性的对象或可迭代的对象来返回一个数组。也就是说它将map里面的值作为数组元素,并返回这个值。