虽然不是最优的,但是是自己捣鼓出来的。
此题使用的是动态规划。
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]; } };