public:
/**
* 解码
* @param nums string字符串 数字串
* @return int整型
*/
/**
*
* dp[i] 表示 前 i 位 可以解码的总数
*
* 分两种情况:
*
* 1. 第i位数字 无法和前面的数组合,
* 比如 1245, 5 只能单独翻译,那么方法数和 124 是一样的
* dp[i] = dp[i - 1]
*
* 2.第i位数字 可以和前面的数组合,
* 比如 1215, 5 可以选择 组合 和 不组合,最终结果为两种情况相加
* a. 选择组合,15看成是整体,那么 dp[i] = dp[i - 2]
* b. 不选择组合,5单独翻译,那么 dp[i] = dp[i - 1]
*
*
*/
int solve(string nums) {
// write code here
if(nums.size()==0||nums[0]=='0'){
return 0;
}
for(int i=1;i<nums.size();i++){
if(nums[i]=='0'&&(nums[i-1]=='0'||nums[i-1]>='3')){//排除100,160这样的结果
return 0;
}
}
int dp[100];
dp[0]=1;
for(int i=1;i<nums.size();i++){
if((nums[i-1]=='1'||nums[i-1]=='2')&&nums[i]=='0'){//特殊数字10 20
if(i==1){
dp[i]=1;
}else{
dp[i]=dp[i-2];
}
continue;
}
if((nums[i-1]=='1')||(nums[i-1]=='2'&&nums[i]<='6')){
if(i==1){
dp[1]=2;
}else{
dp[i]=dp[i-1]+dp[i-2];
}
}
else{
dp[i]=dp[i-1];
}
}
return dp[nums.size()-1];
}
};