题目描述:
一条包含字母 A-Z 的消息通过以下方式进行了编码:'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例 1:
输入: "12"
输出: 2
解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。
此题适宜使用动态规划的方法来做。
这里的状态转移方程比较麻烦,我一开始使用的是如下的状态转移方程:(太麻烦了,以至于我自己都不想解释。。。。)
for(int i=2;i<n;i++){
int ival=stoi(s.substr(i-1,2));
if(s[i]=='0') {
if(ival==0||ival>26) return 0;
if(ival<27&&ival>0) dp.push_back(dp[i-2]);
}else{
if(ival<27&&ival>9) dp.push_back(dp[i-1]+dp[i-2]);
else if(ival<10) dp.push_back(dp[i-1]);
else dp.push_back(dp[i-1]);
}
}
下面,我们看一下pris_bupt所提供的一个状态转移方程:
简洁明了,对应的代码如下:
int numDecodings(string s) {
if (s[0] == '0') return 0;
int pre = 1, curr = 1;//dp[-1] = dp[0] = 1
for (int i = 1; i < s.size(); i++) {
int tmp = curr;
if (s[i] == '0')
if (s[i - 1] == '1' || s[i - 1] == '2') curr = pre;
else return 0;
else if (s[i - 1] == '1' || (s[i - 1] == '2' && s[i] >= '1' && s[i] <= '6'))
curr = curr + pre;
pre = tmp;
}
return curr;
}
(什么时候我能写出这样的代码。。。)
题目来源:https://leetcode-cn.com/problems/decode-ways/
参考资料:https://leetcode-cn.com/problems/decode-ways/solution/c-wo-ren-wei-hen-jian-dan-zhi-guan-de-jie-fa-by-pr/