题目描述
有一种将字母编码成数字的方式:‘a’->1, ‘b->2’, … , ‘z->26’。
现在给一串数字,返回有多少种可能的译码结果
输入
“12”
返回值
2
说明
2种可能的译码结果(”ab” 或”l”)
示例2
输入
“31717126241541717”
返回值
192
思路:
需要考虑0的场景,所以会稍微复杂些。
总体还是动归的思路,设置初始数组DP,DP[i]表示到第i位有多少种编码可能,最好的情况是 (i)和(i-1,i)可以对应两种不同的编码,则DP[i] = DP[i-1] + DP[i-2],但由于0的出现,而且两位的组合要在10~26的范围内,所以要分情况考虑
举例:12可以对应 ab和l,10可以对应j
import java.util.*;
public class Solution {
/**
* 解码
* @param nums string字符串 数字串
* @return int整型
*/
public int solve (String nums){
// write code here
// 要考虑0的场景
if(null == nums || nums.charAt(0) == '0'){
return 0;
}
if(nums.length() == 1){
return 1;
}
int[] DP = new int[nums.length()+1]; // 多请求了1位,方便处理边界场景
DP[0] = 1;
DP[1] = 1;
for(int i = 2; i<=nums.length(); i++){
if(nums.charAt(i-1) == '0'){ // 当 i 位为0时,只能考虑(i-1,i)的组合
if(nums.charAt(i-2) == '0' || nums.charAt(i-2) >= '3'){
return 0;
} else{
DP[i] = DP[i-2];
}
} else{
if(nums.charAt(i-2) != '0' && nums.substring(i-2,i).compareTo("26") <= 0){
DP[i] = DP[i-2]+DP[i-1];
} else {
DP[i] = DP[i-1];
}
}
}
return DP[nums.length()];
}
}