前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode:17 电话号码的字母组合

leetcode:17 电话号码的字母组合

作者头像
贵哥的编程之路
发布2020-10-28 15:25:47
5450
发布2020-10-28 15:25:47
举报
文章被收录于专栏:用户7873631的专栏
代码语言:javascript
复制
/**
 * @param {string} digits
 * @return {string[]}
 */
var letterCombinations = function(str) {
    // 对输入做处理,如果小于1返回空(LeetCode测试用例)
  if (str.length < 1) return []
  // 建立电话号码键盘映射
  let map = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']
  // 如果只给了一个按键,直接把按键内容取出来并按单个字符分组就可以了(LeetCode测试用例)
  if (str.length < 2) return map[str].split('')
  // 把输入字符串按单字符分隔变成数组,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, il = arr[0].length; i < il; i++) {
      for (let j = 0, jl = arr[1].length; j < jl; j++) {
        tmp.push(`${arr[0][i]}${arr[1][j]}`)
      }
    }
    arr.splice(0, 2, tmp)
    if (arr.length > 1) {
      comb(arr)
    } else {
      return tmp
    }
    return arr[0]
  }
  return comb(code)
};

题目理解: 2~9相对应的映射到的字母,获得它所能组成的(((所有的)))字母组合.注意,1什么都没有,1不用算. 比如输入的是23,就是2与3进行组合,并且组合成的数组每一个数组的下标是两个字符的。。。。。 例如输入234,那就是先23进行组合,组合成的数组又与4进行组合,然后输出的每一个数组1的下标是3个。以此类推。。。。。

思路;先联系好所在的数字锁映射到的字母先. 然后是数字2与数字3运算然后组合,然后组成成的(2 3)新数组与4算,然后又组成新(234)一个数组与5算(这样一来都是两两算。)…就行了.

解题步骤: 先映射: let map = [’’, 1, ‘abc’, ‘def’, ‘ghi’, ‘jkl’, ‘mno’, ‘pqrs’, ‘tuv’, ‘wxyz’] 把输入的数字映射(对应)到相对应的字母.

代码语言:javascript
复制
  if (str.length < 1) return []
  // 建立电话号码键盘映射
  let map = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']
  // 如果只给了一个按键,直接把按键内容取出来并按单个字符分组就可以了(LeetCode测试用例)
  if (str.length < 2) return map[str].split('')
  // 把输入字符串按单字符分隔变成数组,234=>[2,3,4]
  let num = str.split('')
  // 保存键盘映射后的字母内容,如 23=>['abc','def']
  let code = []
  num.forEach(item => {
    if (map[item]) {
      code.push(map[item])
    }
  })
代码语言:javascript
复制
num.forEach(item => {
    if (map[item]) {
      code.push(map[item])
    }
  })

这一句是把num也就是输入的数字遍历一下,然后判断map中的下标有没有与输入的一样的数字啊。 有就push进code里,code有什么作用?保存键盘映射后的字母内容

然后是下面是进行组合了.(代码)

代码语言:javascript
复制
 // 临时变量用来保存前两个组合的结果
    let tmp = []
    // 最外层的循环是遍历第一个元素,里层的循环是遍历第二个元素
    for (let i = 0, il = arr[0].length; i < il; i++) {
      for (let j = 0, jl = arr[1].length; j < jl; j++) {
        tmp.push(`${arr[0][i]}${arr[1][j]}`)
      }
    }
    arr.splice(0, 2, tmp)
    if (arr.length > 1) {
      comb(arr)
    } else {
      return tmp
    }
    return arr[0]
  }
  return comb(code)

核心代码:(两个两个组合的代码)

代码语言:javascript
复制
 for (let i = 0, il = arr[0].length; i < il; i++) {
      for (let j = 0, jl = arr[1].length; j < jl; j++) {
        tmp.push(`${arr[0][i]}${arr[1][j]}`)
      }
    }
代码语言:javascript
复制
  arr.splice(0, 2, tmp)

这一句是用tmp这一个替换相组合的两个。 然后tmp这个临时的变量继续与下一个进行组合.

代码语言:javascript
复制
 let tmp = []

为什么tmp是临时的变量,因为他的数据会变化的。

然后通过递归继续与第三个。。。输入的进行组合.

一些条件:

代码语言:javascript
复制
 if (arr.length > 1) {
      comb(arr)
    } else {
      return tmp
    }

为什么,因为最后只剩下一个下标了哈(组合输入的全部完的基础上)

完成…

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档