一、题目描述
二、解题方法
很明显地,需要使用动态规划来解决,我们需要注意以下几个边界条件:
- 设 d p [ i ] dp[i] dp[i]为 s t r [ 0 ] str[0] str[0]~ s t r [ i ] str[i] str[i]的译码方法总数
- 建立最优子结构
- s [ i ] = = s[i] == s[i]== ′ 0 ′ '0' ′0′:那么要求 s [ i − 1 ] = = s[i - 1] == s[i−1]== ′ 1 ′ '1' ′1′ o r or or s [ i − 1 ] = = s[i - 1] == s[i−1]== ′ 2 ′ '2' ′2′,否则无法译码,直接 r e t u r n return return 0 ; 0; 0;
- s [ i − 1 ] = = s[i - 1] == s[i−1]== ′ 1 ′ '1' ′1′:不管 s [ i ] s[i] s[i]是多少,都一定可以组成一个码, d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] dp[i] = dp[i - 1] + dp[i - 2] dp[i]=dp[i−1]+dp[i−2]
- s [ i − 1 ] = = s[i - 1] == s[i−1]== ′ 2 ′ '2' ′2′ a n d and and s [ i ] ∈ [ ′ 1 ′ , ′ 6 ′ ] s[i] \in ['1', '6'] s[i]∈[′1′,′6′]:同理, d p [ i ] = d p [ i − 1 ] + d p [ i − 2 ] dp[i] = dp[i - 1] + dp[i - 2] dp[i]=dp[i−1]+dp[i−2]
- 优化:由上面的分析可知, d p [ i ] dp[i] dp[i]的值只与 d p [ i − 1 ] dp[i - 1] dp[i−1]和 d p [ i − 2 ] dp[i - 2] dp[i−2]有关,可以将空间复杂度从 O ( n ) O(n) O(n)优化到 O ( 1 ) O(1) O(1)
三、解题代码
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;
}
};
四、运行结果
暴力法一定会超时的