public:
    /**
     * 解码
     * @param nums string字符串 数字串
     * @return int整型
     */
       /**
     *
     * dp[i] 表示 前 i 位 可以解码的总数
     *
     * 分两种情况:
     *
     * 1. 第i位数字 无法和前面的数组合,
     *    比如 1245, 5 只能单独翻译,那么方法数和 124 是一样的
     *    dp[i] = dp[i - 1]
     *
     * 2.第i位数字 可以和前面的数组合,
     *   比如 1215, 5 可以选择 组合 和 不组合,最终结果为两种情况相加
     *   a. 选择组合,15看成是整体,那么 dp[i] = dp[i - 2]
     *   b. 不选择组合,5单独翻译,那么 dp[i] = dp[i - 1]
     *
     *
     */
    int solve(string nums) {
        // write code here
        if(nums.size()==0||nums[0]=='0'){
            return 0;
        }
        for(int i=1;i<nums.size();i++){
            if(nums[i]=='0'&&(nums[i-1]=='0'||nums[i-1]>='3')){//排除100,160这样的结果
                return 0;
            }
        }
        int dp[100];
        dp[0]=1;
        for(int i=1;i<nums.size();i++){
            if((nums[i-1]=='1'||nums[i-1]=='2')&&nums[i]=='0'){//特殊数字10 20
                if(i==1){
                    dp[i]=1;
                }else{
                    dp[i]=dp[i-2];
                }
                continue;
            }
            if((nums[i-1]=='1')||(nums[i-1]=='2'&&nums[i]<='6')){
                if(i==1){
                    dp[1]=2;
                }else{
                    dp[i]=dp[i-1]+dp[i-2];
                }          
            }
            else{
                dp[i]=dp[i-1];
            }
        }
        return dp[nums.size()-1];
    }
};