//这里有递归的做法和动态规划的做法参考
/*
class Solution {
public:
    //表示从a的index位置开始之后有多少种译码结果
    int f(string a,int index){
        if(index==a.length()) return 1;
        int p1=0;
        //两格走
        if(index+1<a.length()&&(a[index]=='1'||(a[index]=='2'&&a[index+1]<='6'))){
            p1=f(a,index+2);
        }
        int p2=0;
        if(a[index]!='0')
            p2=f(a,index+1);
        return p1+p2;
    }
    int solve(string nums) {
        return f(nums,0);
    }
};//递归
*/
class Solution {
  public:
    int solve(string nums) {
        int n = nums.size();
        vector<intdp(n + 10);
        dp[n] = 1;
        for (int i = n - 1; i >= 0; i--) {
            int p1 = 0;
            if (i + 1 < n && (nums[i] == '1' || (nums[i] == '2' && nums[i + 1] <= '6'))) {
                p1 = dp[i + 2];
            }
            int p2 = 0;
            if (nums[i] != '0') {
                p2 = dp[i + 1];
            }
            dp[i] = p1 + p2;
        }
        return dp[0];
    }
};//动态规划