[LeetCode 17]电话号码的字母组合

 

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答:

     1.解题思路:

      • 题目包含输入的值不是确定的位数,所以第一个反应是想到用递归。
var letterCombinations = function (digits) {
  const map = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']
  const len = digits.length
  const arr = digits.split('').map(Number)
  const result = []
  function concatStr(i,str) {
    if(i == len){
      result.push(str)
      return
    }
    const tmp = map[arr[i]]
    for(let j=0;j<tmp.length;j++){
      concatStr(i+1,str+tmp[j])
    }
  }
  concatStr(0,'')
  return result

};

     2.解题思路:      

      • 这是leetcode上看到的,用reduce+map代替递归。以后碰到累加的问题可以优先考虑reduce
      • 善用for...of能减少代码           

                  

var letterCombinations = function (digits) {
  const num2letter = {
    '2': ['a', 'b', 'c'],
    '3': ['d', 'e', 'f'],
    '4': ['g', 'h', 'i'],
    '5': ['j', 'k', 'l'],
    '6': ['m', 'n', 'o'],
    '7': ['p', 'q', 'r', 's'],
    '8': ['t', 'u', 'v'],
    '9': ['w', 'x', 'y', 'z']
  }
  //处理length<2的情况
  if (digits.length === 0) return [];
  if (digits.length === 1) return num2letter[digits]

  //数字对应字母数组
  let lettersArr = [];
  for (let item of digits) {
    lettersArr.push(num2letter[item])
  }

  //组合两个旧数组成为一个新数组,然后用这个新数组再去和下一个组合  reduce
  let res = lettersArr.reduce((pre, cur) => {
    let temp = [];
    pre.map(item => {
      cur.map(item1 => {
        temp.push(item + item1)
      })
    })
    return temp;
  })
  return res;
};

 

 

 

posted @ 2020-03-25 16:32  TTtttt5  阅读(189)  评论(0编辑  收藏  举报