一、题目描述
二、解题方法
很明显地,需要使用动态规划来解决,我们需要注意以下几个边界条件:
- 设为~的译码方法总数
- 建立最优子结构
- :那么要求 ,否则无法译码,直接
- :不管是多少,都一定可以组成一个码,
- :同理,
- 优化:由上面的分析可知,的值只与 和有关,可以将空间复杂度从优化到
三、解题代码
class Solution {
public:
int numDecodings(string s) {
auto len = s.size();
if(!len) return 0;
if(s[0] == '0') return 0;
int dp_1 = 1, dp = 1;
for(int i = 1; i < len; i++){
auto tmp = dp;
if(s[i] == '0')
if(s[i - 1] == '1' || s[i - 1] == '2') dp = dp_1;
else return 0;
else if(s[i - 1] == '1' ||(s[i - 1] == '2' && s[i] <= '6' && s[i] >= '1')) dp += dp_1;
dp_1 = tmp;
}
return dp;
}
};
四、运行结果
暴力法一定会超时的