难度:中等
题目描述:
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
示例:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
解题思路:
1 如果数字中所有的连续两个数字组合起来都比25 要大, 说明只有一种翻译方法 比如 555 只能翻译成 f f f
2 如果连续连个相邻数字组合成的数字比10 小, 说明这两个数字也只有一种翻译方法。 比如 501 只能翻译成 f a b
3 当相邻的两个数字组合成的数字 10 <= num <= 25 时, dp[i] = dp[i-1] + dp[i-2] (i>1) dp[0] = 1; dp[1] = 2;
var translateNum = function(num) {
if (num == 0) return 1;
let str = num.toString();
const length = str.length;
let dp = new Array(length).fill(0);
dp[0] = 1;
for(let i = 1; i < length; i++){
let temp = Number(str[i-1] + str[i]);
if (10 <= temp && temp <= 25){
if (i > 1)
dp[i] = dp[i-1] + dp[i-2];
else
dp[i] = 1 + dp[i-1];
}else {
dp[i] = dp[i-1];
}
}
return dp.pop();
};