题目描述
给定一个数字,我们按照如下规则把它翻译为字符串:
0翻译成”a”,1翻译成”b”,……,11翻译成”l”,……,25翻译成”z”。
一个数字可能有多个翻译。例如12258有5种不同的翻译,它们分别是”bccfi”、”bwfi”、”bczi”、”mcfi”和”mzi”。
请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。
样例
Input:"12258"
Output:5
解题思路
-
描述
本题目是一道比较简单的动态规划问题。
对于动态规划问题主要考虑三个问题:
-
状态如何表示
f[i] 表示前i个数字的翻译方法个数
-
状态转换
第i个数字单独翻译,翻译个数等价于前i-1个数字的翻译个数
第i个和第i-1个数字联合翻译,翻译个数需加上前i-2个数字的翻译个数
f [ i ] = f [ i − 1 ] + f [ i − 2 ] ( 是 否 添 加 f [ i − 2 ] 有 条 件 ) f[i] = f[i - 1] + f[i - 2](是否添加f[i - 2]有条件) f[i]=f[i−1]+f[i−2](是否添加f[i−2]有条件)
-
状态边界
f [ 0 ] = f [ 1 ] = 1 f[0] = f[1] = 1 f[0]=f[1]=1
-
-
实现代码:
int getTranslationCount(string s) { int n = s.size(); vector<int> f(n+1); int num; f[0] = 1; f[1] = 1; for(int i=2;i<=n;i++) { f[i] = f[i-1]; num = (s[i - 2] - '0') * 10 + (s[i - 1] - '0'); // 字符串下标从0开始,因此联合翻译的是s[i-2]s[i-1] if((num >= 10) && (num <= 25)) // 是否添加f[i-2]的条件 { f[i] += f[i - 2]; } } return f[n]; }