Leetcode639. Decode Ways II
题目:
A message containing letters from A-Z
is being encoded to numbers using the following mapping way:
'A' -> 1
'B' -> 2
...
'Z' -> 26
Beyond that, now the encoded string can also contain the character ‘*’, which can be treated as one of the numbers from 1 to 9.
Given the encoded message containing digits and the character ‘*’, return the total number of ways to decode it.
Also, since the answer may be very large, you should return the output mod 109+710^9 + 7109+7.
代码(c++):
这个代码有bug,具体出错在求余上。目前还没有解决。
class Solution {public:int numDecodings(string s) {long long int decode1, decode2;if(s[0] == '0') return 0;else if(s[0] == '*') decode1 = 9;else decode1 = 1;if(s.length() == 1) {return decode1;}if(s[0] == '1'){if(s[1] == '0') decode2 = 1;else if(s[1] == '*') decode2 = decode1*9 + 9;else decode2 = 2;}else if(s[0] == '2'){if(s[1] == '0') decode2 = 1;else if(s[1] == '*') decode2 = decode1*9 + 6;else if(s[1]-'0' <= 6) decode2 = 2;else decode2 = 1;}else if(s[0] == '*'){if(s[1] == '0') decode2 = 2;else if(s[1] == '*') decode2 = decode1*9 + 15;else if(s[1]-'0' <= 6) decode2 = decode1 + 2;else decode2 = decode1 + 1;}else {if(s[1] == '0') return 0;else if(s[1] == '*') decode2 = decode1*9;else decode2 = decode1;}for(int i = 2; i < s.length(); i++){long long int temp = decode2;if(s[i-1] == '1'){if(s[i] == '0') decode2 = decode1;else if(s[i] == '*') decode2 = decode2*9 + decode1*9;else decode2 = decode1 + decode2;}else if(s[i-1] == '2'){if(s[i] == '0') decode2 = decode1;else if(s[i] == '*') decode2 = decode2*9 + decode1*6;else if(s[i]-'0' <= 6) decode2 = decode1 + decode2;else decode2 = decode1;}else if(s[i-1] == '*'){if(s[i] == '0') decode2 = decode1*2;else if(s[i] == '*') decode2 = decode2*9 + decode1*15;else if(s[i]-'0' <= 6) decode2 = decode2 + decode1*2;else decode2 = decode2 + decode1;}else {if(s[i] == '0') return 0;else if(s[i] == '*') decode2 = decode2*9;}decode1 = temp;decode2 = decode2 % 1000000007;}return decode2;}
};
接下来的解决方法是leetcode提供的:
一、带记忆的递归
用一个数组memo
来保存子序列的结果,递归求结果。主要的难点就是递推的关系式。时间复杂度O(n)O(n)O(n),空间复杂度O(n)O(n)O(n)。
public class Solution {int M = 1000000007;public int numDecodings(String s) {Integer[] memo=new Integer[s.length()];return ways(s, s.length() - 1,memo);}public int ways(String s, int i,Integer[] memo) {if (i < 0)return 1;if(memo[i]!=null)return memo[i];if (s.charAt(i) == '*') {long res = 9 * ways(s, i - 1,memo);if (i > 0 && s.charAt(i - 1) == '1')res = (res + 9 * ways(s, i - 2,memo)) % M;else if (i > 0 && s.charAt(i - 1) == '2')res = (res + 6 * ways(s, i - 2,memo)) % M;else if (i > 0 && s.charAt(i - 1) == '*')res = (res + 15 * ways(s, i - 2,memo)) % M;memo[i]=(int)res;return memo[i];}long res = s.charAt(i) != '0' ? ways(s, i - 1,memo) : 0;if (i > 0 && s.charAt(i - 1) == '1')res = (res + ways(s, i - 2,memo)) % M;else if (i > 0 && s.charAt(i - 1) == '2' && s.charAt(i) <= '6')res = (res + ways(s, i - 2,memo)) % M;else if (i > 0 && s.charAt(i - 1) == '*')res = (res + (s.charAt(i)<='6'?2:1) * ways(s, i - 2,memo)) % M;memo[i]= (int)res;return memo[i];}
}
二、动态规划
和我的思路大致相同,该答案计算最优解的思路更加清晰简洁。时间复杂度O(n)O(n)O(n),空间复杂度O(n)O(n)O(n);
public class Solution {int M = 1000000007;public int numDecodings(String s) {long[] dp = new long[s.length() + 1];dp[0] = 1;dp[1] = s.charAt(0) == '*' ? 9 : s.charAt(0) == '0' ? 0 : 1;for (int i = 1; i < s.length(); i++) {if (s.charAt(i) == '*') {dp[i + 1] = 9 * dp[i];if (s.charAt(i - 1) == '1')dp[i + 1] = (dp[i + 1] + 9 * dp[i - 1]) % M;else if (s.charAt(i - 1) == '2')dp[i + 1] = (dp[i + 1] + 6 * dp[i - 1]) % M;else if (s.charAt(i - 1) == '*')dp[i + 1] = (dp[i + 1] + 15 * dp[i - 1]) % M;} else {dp[i + 1] = s.charAt(i) != '0' ? dp[i] : 0;if (s.charAt(i - 1) == '1')dp[i + 1] = (dp[i + 1] + dp[i - 1]) % M;else if (s.charAt(i - 1) == '2' && s.charAt(i) <= '6')dp[i + 1] = (dp[i + 1] + dp[i - 1]) % M;else if (s.charAt(i - 1) == '*')dp[i + 1] = (dp[i + 1] + (s.charAt(i) <= '6' ? 2 : 1) * dp[i - 1]) % M;}}return (int) dp[s.length()];}
}
三、常数空间的动态规划
这个的思路和我的思路是一致的,因为最优子问题的解并不需要保存所有,当前长度为n的子问题的解F(n)F(n)F(n)只与F(n−1)F(n-1)F(n−1)和F(n−2)F(n-2)F(n−2)有关。
public class Solution {int M = 1000000007;public int numDecodings(String s) {long first = 1, second = s.charAt(0) == '*' ? 9 : s.charAt(0) == '0' ? 0 : 1;for (int i = 1; i < s.length(); i++) {long temp = second;if (s.charAt(i) == '*') {second = 9 * second;if (s.charAt(i - 1) == '1')second = (second + 9 * first) % M;else if (s.charAt(i - 1) == '2')second = (second + 6 * first) % M;else if (s.charAt(i - 1) == '*')second = (second + 15 * first) % M;} else {second = s.charAt(i) != '0' ? second : 0;if (s.charAt(i - 1) == '1')second = (second + first) % M;else if (s.charAt(i - 1) == '2' && s.charAt(i) <= '6')second = (second + first) % M;else if (s.charAt(i - 1) == '*')second = (second + (s.charAt(i) <= '6' ? 2 : 1) * first) % M;}first = temp;}return (int) second;}
}
c++版代码
class Solution {public:int numDecodings(string s) {int M = 1000000007;long long int first = 1, second = s[0] == '*' ? 9 : s[0] == '0' ? 0 : 1;for (int i = 1; i < s.length(); i++) {long long int temp = second;if (s[i] == '*') {second = 9 * second;if(s[i - 1] == '1') second = (second + 9 * first) % M;else if(s[i - 1] == '2') second = (second + 6 * first) % M;else if(s[i - 1] == '*') second = (second + 15 * first) % M;}else {second = s[i] != '0' ? second : 0;if(s[i - 1] == '1') second = (second + first) % M;else if(s[i - 1] == '2' && s[i] <= '6') second = (second + first) % M;else if(s[i - 1] == '*') second = (second + (s[i] <= '6' ? 2 : 1) * first) % M;}first = temp;}return (int)second;}
};
Leetcode639. Decode Ways II相关推荐
- 【重点!DP】LeetCode 639. Decode Ways II
LeetCode 639. Decode Ways II 参考网址:https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-639-d ...
- [LeetCode] Decode Ways
(Version 0.0) Decode Ways这道题从原理上说是一个比较简单的一维DP题目,用一个一维数组的元素dp[i] (i >= 1)来记录从头开始长度为i的substring有多少种 ...
- Decode Ways leetcode java
题目: A message containing letters from A-Z is being encoded to numbers using the following mapping: ' ...
- 【DFS + 记忆化递归 + DP】LeetCode 91. Decode Ways
LeetCode 91. Decode Ways Solution1:我的答案 还是记录一下,最容易想到的是DFS,但是在第223/238个case上就超时了... class Solution { ...
- [LeetCode]91.Decode Ways
题目 A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A ...
- [LeetCode-Algorithms-91] Decode Ways (2017.10.19-WEEK7)
题目链接:Decode Ways 题目描述:A message containing letters from A-Z is being encoded to numbers using the fo ...
- 【LeetCode】91. Decode Ways 解题报告(Python)
[LeetCode]91. Decode Ways 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fux ...
- 91 Decode Ways
为什么我常常对做题产生恐惧,因为可能为了一个不算难的问题不知不觉绕进去2个小时,这显然是不值得的.这题就是如此. 还要注意,java && 的优先级高于||的优先级,而不是同级. pu ...
- 91 Decode Ways
91 Decode Ways dp解法 O(1) space class Solution:# @param {string} s# @return {integer}def numDecodings ...
- leetcode面试准备:Decode Ways
1 题目 A message containing letters from A-Z is being encoded to numbers using the following mapping: ...
最新文章
- QT [005] 数据库设计 - 一个被忽略的数据库show类 - ConnectionWidget Class
- MongoDB 可视化管理工具 MongoCola-1.1.0 测试版发布
- windows系统常用运行命令大全
- 返回上一页,ajax读出来的数据丢失。
- 用Far制作chm的简易教程
- R-residuals plots
- ICS bomblab总结
- python爬虫 scrapy 爬取腾讯招聘
- 大华摄像头的踩坑之路
- ROS自定义消息类型,编译无法生成 msg/srv 文件产生的头文件
- HMM-前向后向算法
- python中如何判断一个字符串是否可以转换为数字
- st7920驱动OCMJ2X8C屏使用CGRAM自定义图标
- 【总结】1172- 在滴滴和头条干了2年,分享几点感悟!
- 中英文混版时的间距突然变大怎么通过CSS解决?
- 从摄影测量到计算机视觉---讨论计算机视觉和测量的异同点
- VS Code 遇上 Java丨第三章:项目创建与管理
- 读取注册表REG_DWORD类型的键值
- df命令、du命令、磁盘分区
- 保时捷服务器连接不到车辆信息,保时捷carplay插了没反应,保时捷carplay怎么连不上...