/*
这个问题可以分解成很多的子问题,比如以某数字开头的序列一共有多少种解码方法。这种分治的问题可以使用递归的方法。
由于在递归的过程中,有很多是重复的计算,所以可以使用动态规划的方法将计算过的中间结果保存起来,以加快计算。
*/
class Solution {
public int numDecodings(String s) {
int len = s.length();
int[] dp = new int[len + 1];
dp[len] = 1;
if(s.charAt(len - 1) == '0'){
dp[len - 1] = 0;
}
else{
dp[len - 1] = 1;
}
for(int i = len - 2; i >= 0; i--){
if(s.charAt(i) == '0'){
dp[i] = 0;
continue;
}
if((s.charAt(i) - '0') * 10 + (s.charAt(i+1) - '0') <= 26){
dp[i] = dp[i+1] + dp[i+2];
}
else{
dp[i] = dp[i+1];
}
}
return dp[0];
}
}