(M)Dynamic Programming:91. Decode Ways
来源:互联网 发布:全国地区数据库 编辑:程序博客网 时间:2024/06/07 00:18
看大神的分析:
这道题要求解码方法,跟之前那道 Climbing Stairs 爬梯子问题 非常的相似,但是还有一些其他的限制条件,比如说一位数时不能为0,两位数不能大于26,其十位上的数也不能为0,出去这些限制条件,根爬梯子基本没啥区别,也勉强算特殊的斐波那契数列,当然需要用动态规划Dynamci Programming来解。建立一位dp数组,长度比输入数组长多多2,全部初始化为1,因为斐波那契数列的前两项也为1,然后从第三个数开始更新,对应数组的第一个数。对每个数组首先判断其是否为0,若是将改为dp赋0,若不是,赋上一个dp值,此时相当如加上了dp[i - 1], 然后看数组前一位是否存在,如果存在且满足前一位不是0,且和当前为一起组成的两位数不大于26,则当前dp值加上dp[i - 2], 至此可以看出来跟斐波那契数组的递推式一样。
这道题本来和大神想的一样,但是脑子突然秀逗了,觉得dp[i - 1]和dp[i + 1]有好多是重复的,会不会加了重复的解码方案个数,后来一想不会的,因为i在dp[i - 1]和dp[i-2]都没有出现过,i自己解码和i与i-1结合起来解码这两种情况都是新出现的,是dp[i]特有的,都不会重复。
class Solution {public: int numDecodings(string s) { if (s.empty() || (s.size() > 1 && s[0] == '0')) return 0; vector<int> dp(s.size() + 1, 0); dp[0] = 1; for (int i = 1; i < dp.size(); ++i) { dp[i] = (s[i - 1] == '0') ? 0 : dp[i - 1]; if (i > 1 && (s[i - 2] == '1' || (s[i - 2] == '2' && s[i - 1] <= '6'))) { dp[i] += dp[i - 2]; } } return dp.back(); }};
阅读全文
0 0
- (M)Dynamic Programming:91. Decode Ways
- 91. Decode Ways(M)
- Leetcode 91. Decode Ways&&639.Decode ways
- (M)Dynamic Programming:Target Sum
- (M)Dynamic Programming:120. Triangle
- [Leetcode] 91. Decode Ways
- LeetCode --- 91. Decode Ways
- [LeetCode]91.Decode Ways
- [leetcode] 91.Decode Ways
- 91. Decode Ways
- Algorithms-91.Decode Ways
- [leetcode] 91. Decode Ways
- 91. Decode Ways
- Leetcode 91. Decode Ways
- 91. Decode Ways
- leetcode 91. Decode Ways
- 91. Decode Ways
- 91. Decode Ways
- 设计模式之备忘录模式
- 五六单元作业
- 原码, 反码, 补码 详解
- 有10人围成圈数数,每次数到3的人退出其他人继续,问最后剩下的一个人原来的位置是多少
- Maven与Svn的使用
- (M)Dynamic Programming:91. Decode Ways
- Spring Boot入门学习(0)
- [境内法律]中华人民共和国反洗钱法
- console.log()的使用
- pytesseract Windows Error 6错误的解决办法
- 银行储蓄系统的可行性分析
- Linux环境下Python学习(2)
- HDOJ2053_Switch Game
- UVA