LCR 033.字母异位词分组
给定一个字符串数组 strs
,将 变位词 组合在一起。 可以按任意顺序返回结果列表。
**注意:**若两个字符串中每个字符出现的次数都相同,则称它们互为变位词。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例 2:
输入: strs = [""]
输出: [[""]]
示例 3:
输入: strs = ["a"]
输出: [["a"]]
提示:
1 <= strs.length <= 104
0 <= strs[i].length <= 100
strs[i]
仅包含小写字母
法1:
分析:
使用质数
映射a-z
,这样每个字符串对应的质数相乘的数便是唯一的,把这个数作为map的键,如果map存在键,直接push该字符串,否则添加键和空值。
最后结果返回map.values()
var groupAnagrams = function(strs) {
// 质数映射,使用字符'a'到'z'的质数值
const hash = [
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,
43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101
];
const groups = new Map();
for (let str of strs) {
let wordHash = 1;
for (let i = 0; i < str.length; ++i) {
wordHash *= hash[str.charCodeAt(i) - 'a'.charCodeAt(0)];
}
// 如果没有这个wordHash的键,则初始化一个新的数组
if (!groups.has(wordHash)) {
groups.set(wordHash, []);
}
groups.get(wordHash).push(str);
}
// 返回所有分组的数组
return Array.from(groups.values());
};
法2:
分析:
与法1不同,这里是对字符串先转为单个字母的数组,然后排序,最后再转为字符串,将这个字符串作为map的键。
var groupAnagrams = function(strs) {
const groups = new Map();
for (let str of strs) {
// 将字符串转换为字符数组并排序
let charArray = str.split('');
charArray.sort();
let sorted = charArray.join('');
// 如果Map中没有该排序后的字符串,初始化一个新的数组
if (!groups.has(sorted)) {
groups.set(sorted, []);
}
groups.get(sorted).push(str);
}
// 返回所有分组的数组
return Array.from(groups.values());
};