力扣热题---字母异位词分组

69 阅读2分钟

题目描述 image.png 思路

对字符串的每一位基于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;
};

这是提交效果 image.png 消耗内存还可以,但消耗时间有点顶,参数数组循环、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);
};

image.png 这些人真厉害,就一个双层循环居然只能打败18.27%。。。