leetcode(js)算法之17电话号码的字母组合

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

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

示例:

输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

博主的(没有设置边界值):

const str = '23'
const numMap = new Map([[2,'abc'],[3,'def'],[4,'ghi'],[5,'jkl'],[6,'mno'],[7,'pqrs'],[8,'tuv'],[9,'wxyz']])
let combo = str => {
  let strArr = str.split('')
  console.log(strArr)
  let temArr = []
  strArr.map(item => {
    temArr.push(numMap.get(parseInt(item)))
  })
  console.log(temArr)
  temArr = temArr.map(item => {
    return item.split('')
  })
  let len = temArr.length
  for (let x=0;x<=len-1;x++) {
    handle(temArr[0],temArr[1])
    if(temArr.length>2) {
      temArr.splice(0,2,handle(temArr[0],temArr[1]))
    }else {
      return handle(temArr[0],temArr[1])
      break
    }
  }
}
function handle(a, b){

  let arr = []
  a.map(char => {
    b.map(char2 => {
      arr.push(char+char2)
    })
  })
  return arr
}

console.log(combo(str).length)

老师的:

export default (str) => {
  // 建立电话号码键盘映射
  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, 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)
}

猜你喜欢

转载自www.cnblogs.com/raind/p/10500482.html