class Solution {
public:
int numDecodings(string s) {
if (s[0] == '0') return 0;
vector<int> dp(s.size()+1);
dp[0]=1;dp[1]=1;
for (int i =1; i < s.size(); i++) {
if (s[i] == '0')//1.s[i]为0的情况
if (s[i - 1] == '1' || s[i - 1] == '2') //s[i - 1]等于1或2的情况
dp[i+1] = dp[i-1];//由于s[1]指第二个下标,对应为dp[2],所以dp的下标要比s大1,故为dp[i+1]
else
return 0;
else //2.s[i]不为0的情况
if (s[i - 1] == '1' || (s[i - 1] == '2' && s[i] <= '6'))//s[i-1]s[i]两位数要小于26的情况
dp[i+1] = dp[i]+dp[i-1];
else//其他情况
dp[i+1] = dp[i];
}
return dp[s.size()];
}
};
class Solution {
public:
int numDecodings(string s) {
if(s[0]=='0')
return 0;
if(s.size()==1)
return 1;
vector<int> dp(s.size());
dp[0]=1;
bool flag=true;
if(s[1]=='0')
{
if(s[0]>'2')
flag=false;
else
dp[1]=1;
}else
{
if(s[1]<='6'&&s[0]<='2')
dp[1]=2;
else
dp[1]=1;
}
/*
对当前项讨论
1.如果该项为零
1.1如果前一项为0,或大于2则直接跳出循环输出0
1.1如果前一项为1或2,dp[i]=dp[i-2],dp[i]=dp[i-1]
2.如果该项不为零
2.1如果前一项为1或2,且该项小于等于6,dp[i]=dp[i-2]+2
2.1.1该项大于6,dp[i]=dp[i-1]
2.2如果前一项为大于2或为0,dp[i]=dp[i-1]
*/
for(int i=2;i<s.size()&&flag;i++)
{
if(s[i]=='0')
{
if(s[i-1]=='0'||s[i-1]>'2')
{
flag=false;
break;
}else
{
dp[i]=dp[i-2];
dp[i-1]=dp[i-2];
}
}else
{
if(s[i-1]=='0'||s[i-1]>'2')
dp[i]=dp[i-1];
else
{
if(s[i]<='6')
dp[i]=dp[i-2]+2;
else
dp[i]=dp[i-1];
}
}
}
if(flag)
return dp[s.size()-1];
else
return 0;
}
};