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