给定一个数字,我们按照如下规则把它翻译为字符串:
0 翻译成 a,1 翻译成 b,……,11 翻译成 l,……,25 翻译成 z。
一个数字可能有多个翻译。
例如 12258 有 5 种不同的翻译,它们分别是 bccfi、bwfi、bczi、mcfi 和 mzi。
请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。
数据范围
输入数字位数 [1,101]。
样例
输入:"12258"
输出:5
类比爬楼梯,dp[n] = dp[n-1]+dp[n-2] ,dp[n]代表走到最后一个字符,有多少种翻译方法。
对于访问到当前的字符dp[n],能有多少种翻译?
dp[n] = dp[n-1] ;dp[n]+=dp[n-2],此时的条件为前后两个字符可以翻译为同一个字符。以及 04,05,06,只能翻译为1种,其组合并不能作为一种翻译。本题动态规划问题,时间复杂度为O(n)。
class Solution {
public:
int getTranslationCount(string s) {
if(s.empty()) return 0;
int len = s.size();
int dp[len+1];
memset(dp,0,sizeof(dp));
dp[0] = 1;
dp[1] = 1;
for (int i=2;i<=len;i++){
dp[i] = dp[i-1];
int k = s[i-1] - '0';
int k1 = s[i-2] - '0';
if (k1 * 10 + k <= 25 && k1 != 0){
dp[i] += dp[i-2];
}
}
return dp[len];
}
};
