/* 这个问题可以分解成很多的子问题,比如以某数字开头的序列一共有多少种解码方法。这种分治的问题可以使用递归的方法。 由于在递归的过程中,有很多是重复的计算,所以可以使用动态规划的方法将计算过的中间结果保存起来,以加快计算。 */ 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]; } }