17. 电话号码的字母组合
难度中等792
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明: 尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
方法1:
/**
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function(digits) {
//arr = ["abc", "def"]
let arr_multi = arr => {
temp = []
for(let i = 0; i < arr[0].length; i++){
for(let j = 0; j < arr[1].length; j++){
//temp = ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
temp.push(`${arr[0][i]}${arr[1][j]}`)
}
}
//arr => [["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]],注意arr[0]才是答案
arr.splice(0,2,temp)
if(arr.length > 1){
arr_multi(arr)
}
}
if(digits.length){
let map = ["", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]
//"23" => ['2', '3'] => ["abc", "def"]
let after_trans = digits.split('').map(item => map[item * 1])
if(digits.length>1){
arr_multi(after_trans)
}else{//["abc"]
//["abc"] => "abc" => ['a', 'b', 'c']
return after_trans.join('').split('')
}
return after_trans[0]
}else{
return []
}
};
思路:由于不知道具体会输入多少个数字,所以使用递归,每次都是两两组合,组合后替换第一个元素,然后再两两组合,直到数组中只有一个元素,此时返回。