一、题目描述
二、解题思路
用dp[i]
来表示前i个数有多少种翻译的可能,初始情况下,dp[0]是空字符串,所以是1,dp[1]是前1个数,也就是第一个数,所以也是1,从前i=2个数开始(注意这里i=2,在数字字符串中代表前两个数字,dp数组比字符串数组多了一位,在dp数组中就代表空字符串和第0位),有以下两种情况:
-
如果第i-1个数和第i-2个数(实际上就是当前看到的那个数字和前一个数字)组合起来大于25,那么此时前i个数的组合数量就和前i-1个数的组合数量相同,
dp[i] = dp[i-1]
。比如12258,最后看到5和8的时候,58大于25了,所以58没有一个字母来表示,直接看1225有多少个组合可能就可以了。 -
如果第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]
};