1. 题目描述
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
2. 思路
求滚动数组问题:动态规划
(1)设dp[i]为前i个数字有多少种不同的翻译方法,则要求得结果为dp[n];
(2)动态转移方程为:
当第i个数x(i)和第i-1个数x(i-1)可以合并,即10<=x(i-1)x(i)<=25时,dp[i] = dp[i-2]+dp[i-1];
当不能合并时,dp[i] = dp[i-1]。
3. 代码
class Solution {
public int translateNum(int num) {
String nums = String.valueOf(num);
/**
* 设dp[i]为前i个数字有多少种不同的翻译方法,则要求得结果为dp[nums.length()];
* 则动态转移方程为:
* 当第i个数x(i)和第i-1个数x(i-1)可以合并,即10<=x(i-1)x(i)<=25时,dp[i] = dp[i-2]+dp[i-1]
* 当不能合并时,dp[i] = dp[i-1];
*/
int[] dp = new int[nums.length()+1];
//初始化,可以用i=2作为例子
dp[0] = 1;
dp[1] = 1;
for(int i =2;i<=nums.length();i++){
//x(i-1)x(i)
String temp = nums.substring(i-2,i);
//可以合并
if(temp.compareTo("10")>=0 && temp.compareTo("25")<=0)
dp[i] = dp[i-2]+dp[i-1];
//不能合并
else
dp[i] = dp[i-1];
}
return dp[nums.length()];
}
}