class Solution {
public:
    /**
     * 解码
     * @param nums string字符串 数字串
     * @return int整型
     */
  
    //从左到右的试法
    //nums[index..]的转换方法数
    //可变参数index
//     int process(string nums,int index){
//         if(index==nums.length())
//             return 1;
//         if(nums[index]=='0')
//             return 0;
//         int res=process(nums, index+1);
//         if(index+1<nums.length()&&((nums[index]-'0')*10+nums[index+1]-'0'<27)){
//             res+=process(nums, index+2);
//         }
//         return res;
//     }
    
    
    int solve(string nums) {
        // write code here
        if(nums==""||(nums.length()==1&&nums[0]=='0'))
            return 0;
        if(nums.length()==1)
            return 1;
        //首先需要一个长度为nums.lenth()+1的dp数组
        int dp[nums.length()+1];
        //根据base case 最后一个位置的值为1
        dp[nums.length()]=1;
        //对于一个普遍位置,他需要后面一个或两个的值
        //所以需要从后往前遍历dp数组
        for(int i=nums.length()-1;i>=0;i--){
            if(nums[i]=='0'){
                dp[i]=0;
                continue;
            }
            dp[i]=dp[i+1];
            if(i+1<nums.length()&&((nums[i]-'0')*10+nums[i+1]-'0'<27)){
                dp[i]+=dp[i+2];
            }
        }
        return dp[0];
    }
};