/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 解码
* @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];
}