class Solution {
  public:
    /**
        数字范围是1到26,建立同样大小的vector, dp[i] = dp[i-1] + dp[i-2](如果可以这个和前一个能组成一个);
        遇到0,自己不能成组,看前面,若前面不是1和2则不能编译;
		动态规划,dp[i]表示以这个结尾有多少种可能,根据前一个字符的情况,更新当前
     */
    int solve(string nums) {
        if (nums.size() == 0) return 0;
        if (nums.size() == 1) {
            if (nums[0] == '0')return 0;
            else return 1;
        }

        vector<int> dp( nums.size() );

        if (nums[1] == '0' ) {
            if (nums[0] != '1' && nums[0] != '2') {
                return 0;
            } else {
                dp[0]=1;
                dp[1]=1;
            }
        } else {
            if (nums[0] == '0')return 0;
            else if ( stoi(nums.substr(0, 2)) > 26 ) {
                dp[0] = 1;
                dp[1] = 1;
            } else {
                dp[1] = 2;
                dp[0] = 1;
            }
        }


        for (int i = 2; i < nums.size(); i++) {
            if (nums[i] == '0' ) {
                if (nums[i - 1] != '1' && nums[i - 1] != '2') {
                    return 0;
                } else {
                    dp[i] = dp[i - 2];
                }
            } else {
                if (nums[i - 1] == '0')dp[i] = dp[i - 1];
                else if ( stoi(nums.substr(i - 1, 2)) > 26 ) {
                    dp[i] = dp[i - 1];
                } else {
                    dp[i] = dp[i - 1] + dp[i - 2];
                }
            }
        }

        return dp.back();
    }
};