LeetCode 17 Letter Combinations of a Phone Numb (Tag:Hash Table Difficulty:Mid)

251 阅读2分钟

这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

前言

关于 LeetCode 数组类型题目的相关解法,可见LeetCode 数组类型题目做前必看,分类别解法总结了题目,可以用来单项提高。觉得有帮助的话,记得多多点赞关注哦,感谢!

题目描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

image.png 示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:
输入:digits = ""
输出:[]

示例 3:
输入:digits = "2"
输出:["a","b","c"]

链接:leetcode-cn.com/problems/le…

题解

这道题本质是一个组合数的问题,回想组合数,我们每次都是从剩余的元素中来选择一个数来进行递归,这道题目中我们是从数字对应的元素中来选择一个数进行递归。

首先我们要先定义数字和元素的对应关系。这里我们用一个数组来对应,数组的下标表示数字,下标对应的元素就是对应的数字。

然后我们定义dfs,递归终止条件就是递归到最后一个数字,这里我们用 d 表示递归到的下标。递归过程是我们选取 d 对应的字母里的元素,而不再是组合数中剩余的数(具体可以见juejin.cn/post/697841…

具体代码如下,时间复杂度为 O(4^n)

/**
 * @param {string} digits
 * @return {string[]}
 */
var letterCombinations = function(digits) {
  if (digits.length === 0) return []
  const m = [" ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv","wxyz"]
  let cur = []
  let ans = []
  dfs(cur, ans, 0, digits, m)
  return ans 
};

var dfs = (cur, ans, d, digits, m) => {
    if (d === digits.length) {
        ans.push(cur.join(''))
        return
    }
    for (let k of m[digits[d] - '0']) {
        cur.push(k)
        dfs(cur, ans, d + 1, digits, m)
        cur.pop()
    }
}