【LeetCode练习】剑指 Offer 46. 把数字翻译成字符串(中等|JS|动态规划)

一、题目描述

在这里插入图片描述

二、解题思路

dp[i]来表示前i个数有多少种翻译的可能,初始情况下,dp[0]是空字符串,所以是1,dp[1]是前1个数,也就是第一个数,所以也是1,从前i=2个数开始(注意这里i=2,在数字字符串中代表前两个数字,dp数组比字符串数组多了一位,在dp数组中就代表空字符串和第0位),有以下两种情况:

  1. 如果第i-1个数和第i-2个数(实际上就是当前看到的那个数字和前一个数字)组合起来大于25,那么此时前i个数的组合数量就和前i-1个数的组合数量相同,dp[i] = dp[i-1]。比如12258,最后看到5和8的时候,58大于25了,所以58没有一个字母来表示,直接看1225有多少个组合可能就可以了。

  2. 如果第i-1个数和第i-2是大于等于10小于等于25的话,那么除了前i-1个数外,还增加了一种情况就是当前看到的数和前一个数也有一个组合,那么就要把这个单独拿出来看,公式就是dp[i] = dp[i-1] + dp[i-2],比如12216,最后是1和6组合起来小于25,那么除了1221的各种情况搭配6之外,还有122和16搭配。

三、代码实现

var translateNum = function (num) {
    let nums = num.toString()
    const dp = new Array(nums.length+1).fill(1)
    for (let i = 2; i <= nums.length; i++) {
        if (parseInt(nums[i - 2] + nums[i-1]) >= 10 && parseInt(nums[i - 2] + nums[i-1]) <= 25) {
            dp[i] = dp[i - 1] + dp[i - 2]
        } else {
            dp[i] = dp[i - 1]
        }
    }
    return dp[nums.length]
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值