思路:
题目看着简单,但是做起来并没有那么清晰,看题解,该题和 爬楼梯 的题目很类似,想了想确实如此,此题与爬楼梯的区别在于:
爬楼梯的所有方法通过:dp[i]=dp[i-1]+dp[i-2] 推导出来,即 爬一层 和 爬两层的方法 之和。
该题由于限制条件:前缀 0 的存在使得,不能单独为 0,也不能有 01.02...的存在。
因此递推公式需要根据条件的变化而变化,但思想不变的是 依然是两部分之和。
代码:
class Solution {
public:
int numDecodings(string s) {
//dp[i]:前i个元素 的解码方法总数
//初始化:dp[0]=1
//递推公式:
//dp[i]=dp[i-1]+dp[i-2];
/*
for(int i=1;i<=s.size();i++){
if(s[i-1]-'0'>0)dp[i]+=dp[i-1];//一个一个取
if(i>1&&s[i-2]!='0'&&atoi(s.substr(i-2,2).c_str())<27)dp[i]+=dp[i-2];}//两个两个取
*/
vector<int>dp(s.size()+1);
dp[0]=1;
for(int i=1;i<=s.size();i++){
if(s[i-1]-'0'>0)dp[i]+=dp[i-1];//一个一个取
if(i>1&&s[i-2]!='0'&&atoi(s.substr(i-2,2).c_str())<27)dp[i]+=dp[i-2];}
return dp[s.size()];
}
};
注意: