给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]
示例 2:
输入:digits = “”
输出:[]
示例 3:
输入:digits = “2”
输出:[“a”,“b”,“c”]
提示:
0 <= digits.length <= 4
digits[i] 是范围 ['2', '9'] 的一个数字。
【思路】:
这是一个很典型的回溯题,和全排列非常类似。
【代码】:
/**
* @param {string} digits
* @return {string[]}
*/
//k表示第几层,从0---twoarr.length- 1
var dfs = function(twoarr, k, res, path){
//base case
if(k == twoarr.length){
res.push([...path].join(""));
return ;
}
for(let i = 0;i < twoarr[k].length;i++){
path.push(twoarr[k][i]);
dfs(twoarr, k + 1, res, path);
path.pop();
}
}
var letterCombinations = function(digits) {
if(digits == "") return [];
var arr = digits.split("");
for(let i = 0;i < arr.length;i++){
let val = arr[i];
let sub = "";
switch(val){
case "2": sub = "abc";break;
case "3": sub = "def";break;
case "4": sub = "ghi";break;
case "5": sub = "jkl";break;
case "6": sub = "mno";break;
case "7":sub = "pqrs";break;
case "8": sub = "tuv";break;
case "9":sub = "wxyz";break;
}
arr[i] = sub;
}
var twoarr = [];
for(let i = 0;i < arr.length;i++){
twoarr.push(arr[i].split(""));
}
var res = [];
var path = []; //用于回溯的数组
dfs(twoarr, 0, res, path);
return res;
};