剑指OFFER----46、把数字翻译成字符串(js实现)

题目

  • 给定一个数字,我们按照如下规则把它翻译为字符串
    0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。
    一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

  • 示例 1:
    输入: 12258
    输出: 5
    解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”

  • 提示:
    0 <= num < 231

  • leetcode链接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/submissions/


思路

  • 回溯算法
  • 注意这里比较坑的是,0x才能表示一个数,如果0后面不跟非0的数,那么这个0没意义

代码


/**
 * @param {number} num
 * @return {number}
 * 注意一个字母为0的时候
 * 注意两个字母为0的时候
 */
var translateNum = function (num) {
  const numStr = num.toString()
  const result = new Set()
  const path = []
  const letters = 'abcdefghijklmnopqrstuvwxyz'
  function backTracking(index) {
    if (index >= numStr.length) {
      result.add(path.join(''))
      return
    }
    const oneLetter = numStr[index]
    const oneLetterNum = +oneLetter
    if (oneLetterNum !== 0 || index === numStr.length - 1) {
      path.push(letters[oneLetterNum])
      backTracking(index + 1)
      path.pop()
    } else {
      backTracking(index + 1)
    }
    if (index < numStr.length - 1) {
      const twoLetters = numStr.slice(index, index + 2)
      const twoLettersNum = +twoLetters
      if (twoLettersNum !== 0 || index + 1 === numStr.length - 1) {
        if (twoLettersNum <= 25) {
          path.push(letters[twoLettersNum])
          backTracking(index + 2)
          path.pop()
        }
      } else {
        backTracking(index + 2)
      }
    }
  }
  backTracking(0)
  return result.size
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值