LeetCode 算法:变位词组

80 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 17 天,点击查看活动详情

变位词组

原题地址

编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。

注意:本题相对原题稍作修改

示例:

输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

说明:

  • 所有输入均为小写字母。
  • 不考虑答案输出的顺序。

思路分析

方法一

  1. 先定义一个 res 来存储 strs 中每个字符串按照字典顺序排列后的字符串结果;
  2. 定义 map 以字符串排序后的结果为 key,原始字符串组成的数组为 value 来存储分类后的字符串;
  3. 遍历 res 数组,若存在 key,则把 strs 中对应下标的字符串存入 res[key] 中,否则 res[key] = [strs[i]]
  4. 然后返回 Object.values(map) 即可。

方法二

  1. 定义 res 来存储最终结果,定义 tmp 来存储每一组异位词,定义 count 来存储已经是异位词的下标;定义 isWords 方法来判断两个字符串是否为异位词;
  2. 双层遍历 strs,若 count 中包含下标,则跳过这次循环;
  3. i 放入 count,将 strs[i] 放入 tmp,然后二次遍历 strs,拖 strs[i]strs[j] 是异位词,则将 strs[j] 存入 tmp,将 j 存入 count。在外层循环将 tmp 存入 res 中;
  4. 最后返回 res 即可。但是在测试用例倒数第二个中出现了超时,单独执行此方法需要 20s

AC 代码

方法一

/**
 * @param {string[]} strs
 * @return {string[][]}
 */
var groupAnagrams = function(strs) {
    const res = []
    const map = {}
    strs.map(item => res.push(help(item)))
    for(let i = 0; i < res.length; i++) {
        if(map[res[i]]) {
            map[res[i]].push(strs[i])
        } else {
            map[res[i]] = [strs[i]]
        }
    }
    return Object.values(map)
};

var help = function(str) {
    return str.split('').sort().join('')
}

结果:

  • 执行结果: 通过
  • 执行用时:144 ms, 在所有 JavaScript 提交中击败了13.33%的用户
  • 内存消耗:51.5 MB, 在所有 JavaScript 提交中击败了41.33%的用户
  • 通过测试用例:101 / 101

方法二

/**
 * @param {string[]} strs
 * @return {string[][]}
 */
var groupAnagrams = function(strs) {
    const res = []
    let tmp = []
    let count= []
    for(let i = 0; i < strs.length; i++) {
        if(count.includes(i)) continue
        count.push(i)
        tmp = [strs[i]]
        for(let j = i + 1; j < strs.length; j++) {
            if(count.includes(j)) continue
            if(isWords(strs[i], strs[j])) {
                count.push(j)
                tmp.push(strs[j])
            }
        }
        res.push(tmp)
    }
    return res
};

var isWords = function(s, t) {
    if(s.length !== t.length) return false
    return s.split('').sort().join('') === t.split('').sort().join('')
}

结果:

  • 执行结果: 超出时间限制

END