/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 解码
 * @param nums string字符串 数字串
 * @return int整型
 */
 // a b c d e f g h i j  k  l   m  n  o  p  q  r  s  t  u  v  w  x  y  z
 // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
int solve(char* nums ) {
    // write code here
    int len = strlen(nums);
    if(len == 0) return 0;
    if(len == 1 && nums[0] == '0') return 0; 
    int* dp = (int*)malloc(sizeof(int) * len);
    // 第一位数字不管是几,都只有一种译码结果。
    dp[-1] = 1;
    dp[0] = 1;
    for(int i = 1; i < len; i++) {
        // 如果前一位数字是1
        if(nums[i - 1] == '1') {
            // 后一位数字是0,那么只有一种组成10
            if(nums[i] == '0') {
                dp[i] = dp[i - 2];
            } else { //如果后一位数字是非0的数字那么可以和前面的1组合也可以自己单独作为一个字母
                dp[i] = dp[i - 1] + dp[i - 2];
            }
        } else if(nums[i - 1] == '2') {
            // 如果前一位数字是2
            if(nums[i] == '0') { // 后一位数字是0,那么只能组合
                dp[i] = dp[i - 2];
            } else if(nums[i] >= '1' && nums[i] <= '6') {
                // 如果后一位数字在1和6之间,那么即可以组合也可以单独
                dp[i] = dp[i - 1] + dp[i - 2];
            } else{
                // 如果后一位数字是7-9,那么只能单独
                dp[i] = dp[i - 1];
            }
        } else {
            // 如果前一位数字不是1和2,但是后一位数字是0的时候我们认为不能译码
            if(nums[i] == '0') return 0;
            // 如果前一位数字不是1和2,那么不能组合,只有一种方式
            dp[i] = dp[i - 1];
        }
    }
    return dp[len - 1];
}