1. 题目描述
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
说明:
尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。
2. 解题思路
- 建立电话号码与字母的映射,并保存在数组中,数组的索引与字母对应的数字相等
- 将输入的数字进行分隔
- 将数字对应的字母储存在数组中
- 判断输入的数字是否为空、是否只有一个数字
- 先将前两个数字对应的字母进行组合,如果还有更多的数字,就将前数组前两项替换成上面的组合结果,在进行递归操作
- 最后数组只剩下一项,返回数组的第一项
-
3. 代码实现
/**
* @param {string} digits
* @return {string[]}
*/
var letterCombinations = function (digits) {
var map = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz'];
var num = digits.split('');
var code = [];
num.forEach(item => {
if (map[item]) {
code.push(map[item]);
}
})
if (digits === '') {
return [];
}
if (code.length === 1) {
var result = [];
for (var i = 0, length0 = code[0].length; i < length0; i++) {
result.push(code[0][i]);
}
return result;
}
var fn = (digits) => {
var result = [];
for (var i = 0, length1 = digits[0].length; i < length1; i++) {
for (var j = 0, length2 = digits[1].length; j < length2; j++) {
result.push(`${digits[0][i]}${digits[1][j]}`);
}
}
digits.splice(0, 2, result);
if (digits.length > 1) {
fn(digits)
} else {
return result;
}
return digits[0];
}
return fn(code);
};
4. 提交结果