版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题目描述:
一条包含字母 A-Z 的消息通过以下方式进行了编码:
'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例 1:
输入: "12"
输出: 2
解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。
示例 2:
输入: "226"
输出: 3
解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
思路:此题目采用从后向前解码的方式较为简单。申请n+1个空间的dp数组,dp[n]=1用于做初始化操作。此题的正确状态转移方程是
,
表示
单独进行解释,
表示
联合解释。这个题目不应该是这样的状态转移方程
因为无论如何
,是否等于
则需要进行判断
class Solution {
public:
int numDecodings(string s) {
int len=s.size();
vector<int> dp(len+1);
dp[len]=1;//初始化
for(int i=len-1;i>=0;i--){
if(s[i]=='0')
dp[i]=0;//0无法单独作为一个数而且0也没有办法作为十位数
else{
dp[i]=dp[i+1];
if(i+2<=len&&((s[i]-'0')*10+(s[i+1]-'0')<=26))
dp[i]+=dp[i+2];
}
}
return dp[0];
}
};