题目描述
思路
对字符串的每一位基于ascii码计数,并用计数后的数组来表示字符串。
比如'abdfa'可以表示为[2,1,0,1,0,1],对每个字符串这样表示后,通过比较计数的数组就可以忽略相同字母不同位置的影响。直接上代码: * @param {string[]} strs
* @return {string[][]}
*/
var groupAnagrams = function (strs) {
// 思路:将字符串每个字符的Ascii码计数,通过比较计数来比较两个字符串是否为字母异位词
// 小写字母Ascii范围为[97,122]
let count = [], res = [], resIndex = new Array(strs.length).fill(0);
strs.map((item, index) => {
count[index] = new Array(26).fill(0);
for (let i = 0; i < item.length; i++) {
count[index][item[i].charCodeAt(0) - 97]++;
}
for (let i = 0; i < res.length; i++) {
if (judgment(count[index], resIndex[i])) {
res[i].push(item);
return;
}
}
res.push([item]);
resIndex[res.length - 1] = count[index];
})
return res;
};
/**
* @param {number[]} arr1
* @param {number[]} arr2
* @return {bool}
*/
var judgment = function (arr1, arr2) {
// 判断两个数组计数是否相等
for (let i = 0; i < arr1.length; i++) {
if (arr1[i] !== arr2[i]) return false;
}
return true;
};
这是提交效果
消耗内存还可以,但消耗时间有点顶,参数数组循环、res数组循环加上数组比较循环时间复杂度已经达到O(n3),借鉴了评论区哈希表的思想,反思自己怎么没想到。。。
* @param {string[]} strs
* @return {string[][]}
*/
var groupAnagrams = function (strs) {
// 思路:将字符串每个字符的Ascii码计数,通过比较计数来比较两个字符串是否为字母异位词
// 将转化后的数组存入哈希表,基于哈希表的key判断是否相等
let count = [], resMap = new Object();
strs.map((item, index) => {
count[index] = new Array(26).fill(0);
for (let i = 0; i < item.length; i++) {
count[index][item[i].charCodeAt(0) - 97]++;
}
if(resMap[count[index]]) resMap[count[index]].push(strs[index]);
else resMap[count[index]] = [strs[index]];
})
return Object.values(resMap);
};
这些人真厉害,就一个双层循环居然只能打败18.27%。。。