虽然不是最优的,但是是自己捣鼓出来的。
此题使用的是动态规划。
1.dp每走一步的时候,默认为0,先判断当前位置的数字是否在1到26之间,这样就可以初始跟前一个位置的个数一致。
2.如果当前数字跟前一个数字合起来在1到26之间,那么dp值在默认值的基础上可以加上前前位置的个数。(特殊情况是没有前前位置不存在,那么加1就可以了,增加了一种可能)
class Solution {
public:
    /**
     * 解码
     * @param nums string字符串 数字串
     * @return int整型
     */
    int solve(string nums) {
        // write code here
        if(nums.size() == 0){
            return 0;
        }
        int dp[90];
        memset(dp, 0, 90 * sizeof(int));
        int pre = (nums[0]-'0');
        dp[0] = (pre > 0 && pre <= 26) ? 1 : 0;
        for(int i=1;i<nums.size();i++){
            dp[i] = 0;
            int num = (nums[i]-'0');
            if(num >= 1 && num <= 26){
                dp[i] = dp[i-1];
            }
            if(pre>0){
                num += pre*10;
                if(num >= 1 && num <= 26){
                    if(i>1){
                        dp[i] += dp[i-2];
                    }else{
                        dp[i] += 1;
                    }
                }   
            }
            pre = (nums[i]-'0');
        }
        
        return dp[nums.size()-1];
    }
};