** 题目** 力扣91题-解码方法
** 思路:**
*由题可知,解码只有1个字母单独译+2个字母合并译两种方式.1个字母解码的为前一个的解码总数,2个字母解码的为前两个解码总数。
2个字母合并译就三种情况,当前字母为 0,1,2。其余都为1个字母单独译。
当前为‘0’,那么前面一个数字必须为1或2,则解码总数为前一个的解码总数,或者为0
当前为‘1’,有单独译和合并译,两种译法。
当前为‘2’,且前面为‘0’~‘6’。合并译。
** 代码:** (1)自底向下
int numDecodings(string s) {
if (s[0] == '0') return 0;
int pre = 1, curr = 1;//dp[-1] = dp[0] = 1
for (int i = 1; i < s.size(); i++) {
int tmp = curr;
if (s[i] == '0')
if (s[i - 1] == '1' || s[i - 1] == '2') curr = pre;
else return 0;
else if (s[i - 1] == '1' || (s[i - 1] == '2' && s[i] >= '1' && s[i] <= '6'))
curr = curr + pre;
pre = tmp;
}
return curr;
}