确定子问题的时候一定要注意是往前还是往后推导。
本题中,假如是往后递推的话就把每个数字当作是最后一个数字。但是经过实践后发现是不可取的,因为在数据中会发现还有这个叫做0的东西。这个0的存在使得往后递推不是很容易,因为多了好几个判断。所以选择从后往前面递推。那么每个数字看作是每一组数的第一个数字就行了。
public int numDecodings(String s) {
int result = 0;
if (s == null || s.length() == 0) {
return result;
}
int len = s.length();
int[] dp = new int[len + 1];
//初始状态,任何情况下除了零之外的情况。
dp[len] = 1;
//最后一个数字是零的情况。倘若不是零的话就是1,是零的话就是0
if (s.charAt(len - 1) != '0') {
dp[len - 1] = 1;
} else {
dp[len - 1] = 0;
}
for (int i = len - 2; i >= 0; i--) {
//解决是零的情况。
if (s.charAt(i) == '0') {
continue;
} else {
String str = s.substring(i, i + 2);
int a = Integer.parseInt(str);
if (a <=26) {
dp[i] = dp[i + 1] + dp[i + 2];
} else {
dp[i] = dp[i + 1];
}
}
}
return dp[0];
}