力扣 题目91- 解码方法

题目

题解

一看这个题 需要用到之前运算过的结果 那么我一开始是想用回溯算法 但是过不去那就考虑动态规划了

其实我们直接想也可以得到这样dp[i]=dp[i-2]+dp[i-1]

但是有些条件需要考虑即

s[i]=0->dp[i]=dp[i-2]; 因为无法到达 所以只能用dp[i-2]来算 因为dp[i-1]可能与dp[i-2]一起 所以不能用dp[i-1]

s[i]与s[i-1]能够凑成1-26 dp[i]=dp[i-1]+dp[i-2]

不能凑成 dp[i]=dp[i-1]

我们把相同的部分提取一下

        for (int i = 0; i < s.size(); ++i) {
            dp[i + 1] = s[i] == '0' ? 0 : dp[i];
            if (i > 0 && (s[i - 1] == '1' || (s[i - 1] == '2' && s[i] <= '6'))) {
                dp[i + 1] += dp[i - 1];
            }
        }

代码

 1 #include<iostream>
 2 #include<string>
 3 #include<vector>
 4 using namespace std;
 5 
 6 class Solution {
 7 public:
 8     int numDecodings(string s) {
 9         int cnt = 0;
10         if (s.size() == 0 || (s.size() == 1 && s[0] == '0')) {
11             return 0;
12         } 
13         if (s.size() == 1) {
14             return 1;
15         } 
16         vector<int> dp(s.size() + 1, 0);
17         dp[0] = 1;
18         for (int i = 0; i < s.size(); ++i) {
19             dp[i + 1] = s[i] == '0' ? 0 : dp[i];
20             if (i > 0 && (s[i - 1] == '1' || (s[i - 1] == '2' && s[i] <= '6'))) {
21                 dp[i + 1] += dp[i - 1];
22             }
23         }
24         return dp.back();
25     }
26 };
27 
28 int main() {
29     Solution sol;
30     string s = "11101";
31     int result = sol.numDecodings(s);
32     cout << result << endl;
33 }
View Code

 

posted @ 2022-07-15 17:33  无聊的阿库娅  阅读(33)  评论(0编辑  收藏  举报