题目描述
给定一个数字,我们按照如下规则把它翻译为字符串:
0翻译成”a”,1翻译成”b”,……,11翻译成”l”,……,25翻译成”z”。
一个数字可能有多个翻译。例如12258有5种不同的翻译,它们分别是”bccfi”、”bwfi”、”bczi”、”mcfi”和”mzi”。
请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。
样例
输入:"12258"
输出:5
算法
(DP)
- 这道题看的题解,不是很理解。似懂非懂,希望大佬看到了给个提示。
- 为什么将第
i
个数字单独翻译成字母,方案数是f[i - 1]
? - 如果将第
i - 1
和第i
个数字一起翻译成字母,方案数是f[i - 2]
?
时间复杂度
$O(n)$
C++ 代码
class Solution {
public:
int getTranslationCount(string s) {
int n = s.size();
vector<int> f(n + 1, 0);
f[0] = 1;
for(int i = 1; i <= n; i ++)
{
f[i] = f[i - 1];
int t = (s[i - 2] - '0') * 10 + s[i - 1] - '0';
if(t >= 10 && t <= 25) f[i] += f[i - 2];
}
return f[n];
}
};
i-2 i=1时不越界?
想想状态定义
f[i]
表示前i
位数字一共有多少种不同的解析方法。如果第
i
位数字单独解析,它是不影响前i - 1
个数字的解析方法的,所以就顺带的事儿。我之前疑惑的是为什么不是f[i] = f[i - 1] + 1
。同理,如果第
i - 1
和第i
位数字一起解析的话,就是前i - 2
位数字的解析方法数不受影响了,所以是f[i - 2]
。不知道理解的对不对,希望大佬给出指正的建议。
我感觉我对
状态转移
理解的还不够,大佬是怎么理解的呢?大体上是对的,状态转移就相当于把一个大的问题拆成几个较小的问题(或者分情况讨论)
好的谢谢大佬
直接从状态转移的角度理解,这题像是一道有条件限制的爬楼梯问题。
f[i] 一共可以从两种角度转移过来,分别是f[i-1] 和 fi-2。
因此状态转移方程就是:f[i] = f[i-1] + fi-2。
这样可以吗?