「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题意描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母都恰好只用一次。
示例 1:
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"] 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
思路1:构建hash表
分析:根据hash的思想,我们将每个子串使用质数乘法进行hash,只要两个字符串包含的字符与对应数量一致,hash结果则一致。
'abc' = 2*3*4和 'acb' = 2*4*3
利用构建哈希表保存记录,直接读取。
var groupAnagrams = function (strs) {
let n = strs.length;
let ans = new Map();
const prime = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103];
let mod = 1e9 + 7;
for (let i = 0; i < n; i++) {
let hash = 1;
for (let j = 0; j < strs[i].length; j++) {
let num = strs[i].charCodeAt(j) - 97;
hash = ((hash % mod) * (prime[num] % mod)) % mod;
}
if (!ans.get(hash)) ans.set(hash, []);
ans.get(hash).push(strs[i]);
}
return [...ans.values()];
};
思路2:排序
步骤:
-
compareArr 放置排序后的不同字符串元素
-
遍历数组,获取当前字符串升序排列后的结果
-
获取在compareArr中的索引
-
如果是-1时,表示未出现过,compareArr追加结果字符串
result则增加新的子元素数组,数组内部元素为当前字符串
-
如果非-1时,在result对应位置的子数组中追加当前字符串
var groupAnagrams = function(strs) {
let result = [], // 结果数组
compareArr = []; // 用以比较的字符串数组
strs.forEach(item => {
// 获取当前字符串 => 按字母升序排列后的字符串
let cur = item.split('').sort((a, b) => a.localeCompare(b)).join(''),
// 获取在比较字符串数组中的索引
index = compareArr.indexOf(cur);
if(index === -1) { // 未出现过
compareArr.push(cur); // 比较字符串增加
result.push([item]); // 结果数组末尾增加
} else { // 出现过
result[index].push(item); // 在给定位置的子数组中继续追加
}
})
return result;
};
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤