public class Solution { /** * 解码 * @param nums string字符串 数字串 * @return int整型 */ public int solve (String nums) { // write code here if (nums.length() == 0 || nums.charAt(0) == '0') return 0; // 状态转移式 int[] dp = new int[nums.length()]; dp[0] = 1; // 如果前置数不是 ‘0’,则开始进行译码工作 for (int i = 1; i < nums.length(); i ++) { // 如果当前数不为 0, 则 dp[i] = dp[i - 1]; if (nums.charAt(i) != '0') dp[i] = dp[i - 1]; // 判断当前数和前一个数组成的数是否合法 int temp = (nums.charAt(i - 1) - '0') * 10 + (nums.charAt(i) - '0'); if (temp >= 10 && temp <= 26) { // 判断当前位数是否只有两位,若成立,则 dp[i] += 1 // 防越界 dp[1 - 2] 不合法 if (i == 1) dp[i] ++; else dp[i] += dp[i - 2]; } } return dp[nums.length() - 1]; // return dfs(nums, 0); } // public int solve1(String nums) { // return dfs(nums, 0); // } public int dfs(String nums, int start) { // 若遍历完字符串,则返回 1 if (start == nums.length()) return 1; // 若当前元素为 0,则返回 0 if (nums.charAt(start) == '0') return 0; // 遍历求下一个数 int res1 = dfs(nums, start + 1); int res2 = 0; // 若前置数为 1 或 前置数为 2 并且 当前数 小于 6,则后移两位继续遍历 if (start + 1 < 26 && (nums.charAt(start) == '1' || (nums.charAt(start) == '2' && nums.charAt(start + 1) <= '6'))) { res2 = dfs(nums, start + 2); } return res1 + res2; } }