LeetCode:17. 电话号码的字母组合

题目描述:

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例:

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

题目链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/

解题思路:

这其实就是我们高中所学的组合运算,不过这里是用代码实现。这里我们只需将前两项的组合结果作为值与下一项继续组合

题目答案:

var letterCombinations = function(str) {
  // 建立电话号码键盘映射 (0 和  1 项没有值)
  let map = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']
  // 把输入字符串按单字符分隔变成数组,如 234 => [2,3,4]
  let num = str.split('')
  // 保存键盘映射后的字母内容,如 23 => ['abc', 'def']
  let code = []
  num.forEach(item => {
    if (map[item]) {
      code.push(map[item])
    }
  })
  // 组合运算方法
  let comb = arr => {
    // 临时变量用来保存前两个组合的结果
    let tmp = []
    // 最外层的循环是遍历第一个元素,里层的循环是遍历第二个元素
    for (let i = 0, ilen = arr[0].length; i < ilen; i++) {
      for (let j = 0, jlen = arr[1].length; j < jlen; j++) {
        tmp.push(`${arr[0][i]}${arr[1][j]}`)
      }
    }
    // 替换掉前两项
    arr.splice(0, 2, tmp)
    // 判断是否组合完成
    if (arr.length > 1) {
      comb(arr) // 递归
    } else {
      return tmp
    }
    // 这里需要返回 arr[0]:function 的默认返回值是 undefined,为后续return comb(code)提供值
    return arr[0]
  }
  if (num.length === 0) {
    return []
  } else if (num.length === 1) {
    return map[num[0]].split('') // 如: 2 => ['a', 'b', 'c']
  } else {
    return comb(code)
  }
};

测试结果:

 

 

发布了83 篇原创文章 · 获赞 113 · 访问量 5万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览