对字符串2223进行分析,从字符串末尾向前递推 首字母为零、组合起来大于26的情况为0种 对230分析
public class Solution { public int numDecodings(String s) { if(s == null || s.length() == 0) return 0; int len = s.length(); int[] arr = new int[len]; //从字符串末尾向前迭代 for (int i = len - 1; i >= 0; i--) { //本位是0这个长度就直接是0种方案 if(s.charAt(i) == '0'){ arr[len - 1 - i] = 0; continue; } //子串长度为1特判 if(i == len - 1){ arr[len - 1 - i] = 1; continue; } //长度为2特判 if(i == len - 2){ int ten = s.charAt(i) - '0'; int digit = s.charAt(i + 1) - '0'; int num = ten * 10 + digit; //应对10、20的情况 if(num == 10 || num == 20){ arr[len - 1 - i] = 1; continue; } if(num <=26 && i == len - 2){ arr[len - 1 - i] = 2; } else { arr[len - 1 - i] = arr[len - 2 - i]; } continue; } if(i < len - 1){ int ten = s.charAt(i) - '0'; int digit = s.charAt(i + 1) - '0'; int num = ten * 10 + digit; //如果小于等于26,等于长度为i - 1和i - 2的和(前提长度大于2) if(num <= 26 && (len - 3 - i) >= 0){ arr[len - 1 - i] = arr[len - 2 - i] + arr[len - 3 - i]; } else { arr[len - 1 - i] = arr[len - 2 - i]; } } } return arr[len - 1]; } public static void main(String[] args) { String str = "230"; Solution solution = new Solution(); int ans = solution.numDecodings(str); System.out.println(ans); } }