这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战
前言
关于 LeetCode 数组类型题目的相关解法,可见LeetCode 数组类型题目做前必看,分类别解法总结了题目,可以用来单项提高。觉得有帮助的话,记得多多点赞关注哦,感谢!
题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 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()
}
}