import java.util.*;
public class Solution {
/**
* 解码
* @param nums string字符串 数字串
* @return int整型
*/
/**
思路: '1' 有a 1种情况
'11' 有aa和l 2种情况
'111' 有aaa和al和la 3种情况
'1111' 有aaaa和laa和ala和aal和ll 5种情况
.......
由上可知
1.如果当前字符是可以与前一个字符组合的
那么 f(n) = f(n-1) + f(n-2);
即 要么把当前字符加入其中就相当于在字符串末尾多家了一个字符 f(n) = f(n-1)
要么把当前加入字符的前一个字符拿过来和当前字符组成一个新的字符加入末尾
f(n) = f(n-2);
2.如果当前字符不可以与前一个字符组合的
f(n) = f(n-1);
将该字符加入字符串末尾 不会对原情况数造成任何影响
当然 也要排除一些不可能的情况
*/
public int solve (String nums) {
// write code here
//当输入为"0"时
if(nums.equals("0")) return 0;
//当出现10 和 20 时 只有一种情况
if(nums.equals("10") || nums.equals("20")) return 1;
//如果0的前面不是1 或 2 则译码出错误
for(int i = 1; i < nums.length(); i++){
if(nums.charAt(i) == '0')
if(nums.charAt(i - 1) != '1' && nums.charAt(i - 1) != '2')
return 0;
}
int []dp = new int[nums.length()+1];
dp[0]=1;
dp[1]=1;
for(int i = 2 ; i <=nums.length() ; i++){
if( (nums.charAt(i-2)=='1'&& nums.charAt(i-1)!='0' )|| (nums.charAt(i-2)=='2' && nums.charAt(i-1)<'7' && nums.charAt(i-1)!='0')){
dp[i] = dp[i-1] + dp[i-2];
}else{
dp[i] = dp[i-1];
}
}
return dp[nums.length()] ;
}
}