1. 题目描述

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
17. 电话号码的字母组合 - 图1

示例

  1. 输入:"23"
  2. 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
  3. 说明:
  4. 尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。

2. 解题思路

  1. 建立电话号码与字母的映射,并保存在数组中,数组的索引与字母对应的数字相等
  2. 将输入的数字进行分隔
  3. 将数字对应的字母储存在数组中
  4. 判断输入的数字是否为空、是否只有一个数字
  5. 先将前两个数字对应的字母进行组合,如果还有更多的数字,就将前数组前两项替换成上面的组合结果,在进行递归操作
  6. 最后数组只剩下一项,返回数组的第一项
  7. 执行该函数,返回最后的结果

    3. 代码实现

    1. /**
    2. * @param {string} digits
    3. * @return {string[]}
    4. */
    5. var letterCombinations = function (digits) {
    6. var map = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz'];
    7. var num = digits.split('');
    8. var code = [];
    9. num.forEach(item => {
    10. if (map[item]) {
    11. code.push(map[item]);
    12. }
    13. })
    14. if (digits === '') {
    15. return [];
    16. }
    17. if (code.length === 1) {
    18. var result = [];
    19. for (var i = 0, length0 = code[0].length; i < length0; i++) {
    20. result.push(code[0][i]);
    21. }
    22. return result;
    23. }
    24. var fn = (digits) => {
    25. var result = [];
    26. for (var i = 0, length1 = digits[0].length; i < length1; i++) {
    27. for (var j = 0, length2 = digits[1].length; j < length2; j++) {
    28. result.push(`${digits[0][i]}${digits[1][j]}`);
    29. }
    30. }
    31. digits.splice(0, 2, result);
    32. if (digits.length > 1) {
    33. fn(digits)
    34. } else {
    35. return result;
    36. }
    37. return digits[0];
    38. }
    39. return fn(code);
    40. };

    4. 提交结果

    17. 电话号码的字母组合 - 图2