public class Solution {
    /**
     * 解码
     * @param nums string字符串 数字串
     * @return int整型
     */
    public int solve (String nums) {
        // write code here
        if(nums == null || nums.length() == 0 ){
            return 0;
        }
        //dp[i] 表示字符串nums中以i个位置结尾的前缀字符串的解码种数.i = 1 ,index = 0 
        //一种情况是第i位可以独立编码,另一种情况是第i位可以和第i-1位字符组合进行编码
        int[] dp = new int[nums.length() + 1];
        dp[0] = 1;
        dp[1] = nums.charAt(0) == '0' ? 0 : 1;
        for(int i = 2 ;i< dp.length ;i++){
           if(nums.charAt(i-1) == '0'){
               //第i -1 个数 是 0 ,那么 i -2 个数需要时1 或者 2 才能组合
               if(nums.charAt(i - 2) == '1' || nums.charAt(i-2) == '2' ){
                   // 20 xxx ,说明当前数只能作为独立的一种进行解码,不能和其他组合
                   dp[i] = dp[i-2];
               }else{
                   return 0;
               }
           }else if(nums.charAt(i-1) >= '1' && nums.charAt(i-1) <= '6'){
               //当前数 在 1-6 范围内,
               if(nums.charAt(i-2) == '1' || nums.charAt(i-2) == '2'){
                   //1-2 说明i-1 和 i-2 可以作为组合 当前数可以最为独立编码 有两个可能, 2 6 x 可以是26 x dp[i-2]也可以是 2 6 x dp[i-1]
                   //看这三个数怎么组合,
                   dp[i] = dp[i-2] + dp[i-1];
               }else{
                   //3...6   1....6,后一个数是就只能自己作为一种编码了
                   dp[i] = dp[i-1];
               }
               
           }else{
               // 前一个数是 7 到 9 ,前前一个数是1的话 
               if(nums.charAt(i-2) == '1'){
                   dp[i] = dp[i-1] + dp[i-2];
               }else{
                   dp[i] = dp[i-1];
               }
           }
        }
        return dp[nums.length()];
    }
}