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;
    }
}