力扣 题目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 }