class Solution {
public:
int numDecodings(string s) {
if(s.empty()) return 0;
if(s.size()==1&&s=="0") return 0;
if(s.size()==1&&s!="0") return 1;
if(s[0]=='0') return 0;
int dp1 = 1,dp2=1;
for(int i = 1; i < s.size(); i++){
int codeInt = 10 * (s[i - 1] - '0') + s[i] - '0', tmp = dp1; //前一次的一定要保留; 2123 23结合 dp2相当于21的种数;
if(s[i] == '0' && (s[i-1] == '0' || s[i-1] > '2')) return 0;
if (codeInt == 10 || codeInt == 20) dp1 = dp2; //碰到0不加;退回到前前的情况
else if (10 < codeInt && codeInt <= 26) dp1 += dp2; //else 一定要加;
dp2 = tmp;
}
return dp1;
}
};
public:
int numDecodings(string s) {
if(s.empty()) return 0;
if(s.size()==1&&s=="0") return 0;
if(s.size()==1&&s!="0") return 1;
if(s[0]=='0') return 0;
int dp1 = 1,dp2=1;
for(int i = 1; i < s.size(); i++){
int codeInt = 10 * (s[i - 1] - '0') + s[i] - '0', tmp = dp1; //前一次的一定要保留; 2123 23结合 dp2相当于21的种数;
if(s[i] == '0' && (s[i-1] == '0' || s[i-1] > '2')) return 0;
if (codeInt == 10 || codeInt == 20) dp1 = dp2; //碰到0不加;退回到前前的情况
else if (10 < codeInt && codeInt <= 26) dp1 += dp2; //else 一定要加;
dp2 = tmp;
}
return dp1;
}
};