package class30; public class Problem_0091_DecodeWays { public static int numDecodings1(String s) { if (s == null || s.length() == 0) { return 0; } char[] str = s.toCharArray(); return process(str, 0); } // 潜台词:str[0...index-1]已经转化完了,不用操心了 // str[index....] 能转出多少有效的,返回方法数 public static int process(char[] str, int index) { if (index == str.length) { return 1; } if (str[index] == '0') { return 0; } int ways = process(str, index + 1); if (index + 1 == str.length) { return ways; } int num = (str[index] - '0') * 10 + str[index + 1] - '0'; if (num < 27) { ways += process(str, index + 2); } return ways; } public static int numDecodings2(String s) { if (s == null || s.length() == 0) { return 0; } char[] str = s.toCharArray(); int N = str.length; // dp[i] -> process(str, index)返回值 index 0 ~ N int[] dp = new int[N + 1]; dp[N] = 1; // dp依次填好 dp[i] dp[i+1] dp[i+2] for (int i = N - 1; i >= 0; i--) { if (str[i] != '0') { dp[i] = dp[i + 1]; if (i + 1 == str.length) { continue; } int num = (str[i] - '0') * 10 + str[i + 1] - '0'; if (num <= 26) { dp[i] += dp[i + 2]; } } } return dp[0]; } public static int numDecodings(String s) { if (s == null || s.length() == 0) { return 0; } char[] str = s.toCharArray(); int N = str.length; int[] dp = new int[N + 1]; dp[N] = 1; for (int i = N - 1; i >= 0; i--) { if (str[i] == '0') { dp[i] = 0; } else if (str[i] == '1') { dp[i] = dp[i + 1]; if (i + 1 < N) { dp[i] += dp[i + 2]; } } else if (str[i] == '2') { dp[i] = dp[i + 1]; if (i + 1 < str.length && (str[i + 1] >= '0' && str[i + 1] <= '6')) { dp[i] += dp[i + 2]; } } else { dp[i] = dp[i + 1]; } } return dp[0]; } }