剑指offer46-AcWing-59. 把数字翻译成字符串
给定一个数字,我们按照如下规则把它翻译为字符串:
0翻译成”a”,1翻译成”b”,……,11翻译成”l”,……,25翻译成”z”。
一个数字可能有多个翻译。例如12258有5种不同的翻译,它们分别是”bccfi”、”bwfi”、”bczi”、”mcfi”和”mzi”。
请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。
样例
输入:"12258"
输出:5
思路:
动态规划问题。
第i个位置上的组合次数为:f(i) = f(i+1) + g(i, i+1)*f(i + 2),其中f(i+1)和f(i+2)分别为第i+1和第i+2位置上组合次数。g(i, i+1)表示第i位置和i+1位置上的数组合起来是不是在0-25范围内。
例如:24XXXXXX,求数字2位置上的组合结果,可以理解为2 + 4XXXXXX 再加上 24 + XXXXXX。
C++ code:
class Solution {
public:
int getTranslationCount(string s) {
int n = s.size();
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}
vector<int> res(n+1, 0);
res[n-1] = 1;
for(int i = n-2; i >= 0; i--){
res[i] = res[i+1];
if(s[i] == '1' || (s[i] == '2' && s[i+1] < '6')){
res[i] += res[i+2];
}
}
return res[0];
}
};