import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 解码 * @param nums string字符串 数字串 * @return int整型 */ public int solve (String nums) { // write code here // 算法核心思想:从0到n,以n为出口的记忆化搜索 // dp[i] - 表示从第i字符到结尾,总共有dp[i]种译法 int[] dp = new int[nums.length() + 1]; for (int i = 0; i < dp.length; i++) { dp[i] = -1; } return process(nums, 0, dp); } public int process (String nums, int i, int[] dp) { int n = nums.length(); // 递归出口 if (i == n) { dp[i] = 1; return dp[i]; } // 递归分支 if (dp[i] != -1) { return dp[i]; } // 可以只译当前一位数,也可以尝试译两位数 // 先尝试只译一位数 int num = Integer.parseInt(nums.substring(i, i + 1)); int one = 0; if (num != 0) { // 注意非0 if (dp[i + 1] == -1) { dp[i + 1] = process(nums, i + 1, dp); } one = dp[i + 1]; } // 再尝试译两位数 int two = 0; if (i < n - 1 && num != 0) { // 确保不越界,且不以0开头 num = Integer.parseInt(nums.substring(i, i + 2)); if (num > 0 && num <= 26) { // 合法字母 if (dp[i + 2] == -1) { dp[i + 2] = process(nums, i + 2, dp); } two = dp[i + 2]; } } // 计算结果 dp[i] = one + two; return dp[i]; } }