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()];
}
}