17题电话号码的字母组合
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
(手机九键输入对应关系)。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
题解:
var letterCombinations = function(digits) {
let code = ['','','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz'];
let arr = digits.split('').filter(item => item > 1 && item<10);
let letter_arr = arr.map(item => {
return code[item];
});
if(letter_arr.length==0)return letter_arr;
if(letter_arr.length==1)return letter_arr[0].split('');
function handle(arr) {
let result = [];
for(let i = 0; i < arr[0].length; i++){
for(let j = 0; j < arr[1].length; j++) {
result.push(`${arr[0][i]}${arr[1][j]}`);
}
}
if(arr.length>2){
arr.splice(0,2,result);
return handle(arr);
}else {
return result;
}
}
return handle(letter_arr);
};
如上,需要使用递归的方式来做参考题解说是回溯法,需要注意的是当输入0或1的时候或者输入一个数字的时候(容易漏掉这点)。思路上来讲就是最开始前两项进行组合,如果后面还有就开始递归去做,递归的时候把组合过的前两项去掉,并把组合过的结果放入第一项,然后按照同样的方式进行再组合。