class Solution {
public:
    /**
     * 解码
     * @param nums string字符串 数字串
     * @return int整型
     */
/*
分成四种情况 当前数字nums(i-1), 之前数字nums(i-2)
1,无法独立编码也无法组合编码
nums(i-1) == 0 && (nums(i-2) == 0 || nums(i-2) > 2)
2, 只能组合编码
nums(i-1) = 0
3,只能独立编码
nums(i-2) == 0 || nums(i-2) >2
4, 其他(两种编码方式都可)
dp(i) = dp(i-1) + dp(i-2);
*/
    int solve(string nums) {
        if (nums == "" || nums.length() == 0) {
            return 0;
        }
        int len = nums.size();
        vector<int>dp (len + 1, 0); // 表示以i结尾的种类
        dp[0] = 1;
        dp[1] = (nums[0] == '0') ? 0 : 1;
        for(int i = 2; i <= len; i++) {
            // 无法获取值
            if (nums[i-1] == '0' && (nums[i-2] == '0' || nums[i-2] > '2')) {
                return 0;
            } else if (nums[i-1] == '0') { // 只能组合
                dp[i] = dp[i-2]; 
            } else if (nums[i-2] == '0' || nums[i-2] > '2' || (nums[i-2] == '2' && nums[i-1] > '6')) { // 只能独立
                dp[i] = dp[i-1];
            } else { // 其他情况
                dp[i] = dp[i-1] + dp[i-2];
            }
        }
        return dp[len];
        // write code here
    }
};