此题与之前爬梯子类似,通过动态规划建立状态转移方程:dp[i] =dp[i-1]+dp[i-2];
难点在于约束条件的判定,以及dp[1]的选择。
int numDecodings(string s) {
if(s.empty()||s[0] == '0')return 0;
int m = s.size();
if(m==1)return 1;
vector<int> dp(m);
dp[0] = 1;
if(s[0]<='2'&&s[1] == '0')dp[1]=1;
else if(s[1] == '0'&&s[0]>'2')dp[1]=0;
else if((s[0] == '1')||(s[0]=='2'&&s[1]<='6'))dp[1]=2;
else dp[1]=1;
for(int i=2;i<m;i++)
{
dp[i] = (s[i]=='0')?0:dp[i-1];
if((i>1)&&((s[i-1] == '1')||(s[i-1]=='2'&&s[i]<='6')))dp[i] +=dp[i-2];
}
return dp[m-1];
}