三步走,定义状态,状态转移方程,basecase
1.定义状态:dp[i]表示的是以s[i]为结尾可以有几种解码方法
2.状态转移:如果s[i]不为0,那么dp[i]继承dp[i-1],也就是dp[i]=dp[i-1]1。如果s.substr(i-1,2)的数字>=10且<=26,那么证明又多了一种表示方法,就让dp[i] += dp[i-2]1。加入126dp[0]=1,dp[1]=2,dp[3]就等于dp[2]的两种方式s.substr(3)这种方式+dp[1]的一种方式s.substr(2,3)这种方式
class Solution {
public:
int numDecodings(string s) {
//如果有前导0直接false
if(s[0] == '0') return 0;
vector<int> dp(s.length());
//定义状态:dp[i]表示的是以s[i]为结尾可以有几种解码方法
//状态转移:如果s[i]不为0,那么dp[i]继承dp[i-1],也就是dp[i]=dp[i-1]*1
//如果s.substr(i-1,2)的数字>=10且<=26,那么证明又多了一种表示方法,就让dp[i] += dp[i-2]
//初始化:dp[0] = 1
dp[0] = 1;
for(int i = 1; i < s.length(); ++i){
if(s[i] != '0'){
dp[i] = dp[i-1];
}
int num = (s[i-1]-'0')*10 + (s[i]-'0');
if(num >= 10 && num <= 26){
if(i == 1) dp[i] += 1;
else dp[i] += dp[i-2];
}
}
return dp[s.length()-1];
}
};