1. 题目描述
给定一个数字,我们按照如下规则把它翻译为字符串: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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 题解
1、动态规划
分析:记f(i)为 0~i 位能翻译成字符串的个数,当前第 i 位可以单独翻译为字符串则对 f(i) 的贡献为 f(i-1),当前第 i 位 可以和 第 i-1 位联合起来翻译成字符串(满足数字∈[10, 25])则对 f(i) 的贡献为 f(i-2),因此 f(i) = f(i-1) + f(i-2),这里的 f(i-2) 在不满足条件时为0。
实际只需要 f(i),f(i-1), f(i-2)这三个变量滚动变换就可以代替动态数组。
时间复杂度:O(n)
空间复杂度:O(1)
/**
* @param {number} num
* @return {number}
*/
var translateNum = function(num) {
let str = num.toString();
let c0 = 0, c1 = 1, c2 = 0; //分别代表 f(i-2), f(i-1), f(i)
//注意这里 i 从0开始
for(let i = 0; i < str.length; i++){
let temp = str.charAt(i-1)+str.charAt(i);
let tempNum = parseInt(temp);
if(tempNum >= 10 && tempNum <= 25){
c2 = c0 + c1;
c0 = c1;
c1 = c2;
}else{
c2 = c1;
c0 = c1;
}
}
return c2;
};
本题和“打家劫舍”题类似:House Robber I