题目:

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相关推荐

  1. 【重点!DP】LeetCode 639. Decode Ways II

    LeetCode 639. Decode Ways II 参考网址:https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-639-d ...

  2. [LeetCode] Decode Ways

    (Version 0.0) Decode Ways这道题从原理上说是一个比较简单的一维DP题目,用一个一维数组的元素dp[i] (i >= 1)来记录从头开始长度为i的substring有多少种 ...

  3. Decode Ways leetcode java

    题目: A message containing letters from A-Z is being encoded to numbers using the following mapping: ' ...

  4. 【DFS + 记忆化递归 + DP】LeetCode 91. Decode Ways

    LeetCode 91. Decode Ways Solution1:我的答案 还是记录一下,最容易想到的是DFS,但是在第223/238个case上就超时了... class Solution { ...

  5. [LeetCode]91.Decode Ways

    题目 A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A ...

  6. [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 ...

  7. 【LeetCode】91. Decode Ways 解题报告(Python)

    [LeetCode]91. Decode Ways 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fux ...

  8. 91 Decode Ways

    为什么我常常对做题产生恐惧,因为可能为了一个不算难的问题不知不觉绕进去2个小时,这显然是不值得的.这题就是如此. 还要注意,java && 的优先级高于||的优先级,而不是同级. pu ...

  9. 91 Decode Ways

    91 Decode Ways dp解法 O(1) space class Solution:# @param {string} s# @return {integer}def numDecodings ...

  10. leetcode面试准备:Decode Ways

    1 题目 A message containing letters from A-Z is being encoded to numbers using the following mapping: ...

最新文章

  1. QT [005] 数据库设计 - 一个被忽略的数据库show类 - ConnectionWidget Class
  2. MongoDB 可视化管理工具 MongoCola-1.1.0 测试版发布
  3. windows系统常用运行命令大全
  4. 返回上一页,ajax读出来的数据丢失。
  5. 用Far制作chm的简易教程
  6. R-residuals plots
  7. ICS bomblab总结
  8. python爬虫 scrapy 爬取腾讯招聘
  9. 大华摄像头的踩坑之路
  10. ROS自定义消息类型,编译无法生成 msg/srv 文件产生的头文件
  11. HMM-前向后向算法
  12. python中如何判断一个字符串是否可以转换为数字
  13. st7920驱动OCMJ2X8C屏使用CGRAM自定义图标
  14. 【总结】1172- 在滴滴和头条干了2年,分享几点感悟!
  15. 中英文混版时的间距突然变大怎么通过CSS解决?
  16. 从摄影测量到计算机视觉---讨论计算机视觉和测量的异同点
  17. VS Code 遇上 Java丨第三章:项目创建与管理
  18. 读取注册表REG_DWORD类型的键值
  19. df命令、du命令、磁盘分区
  20. 保时捷服务器连接不到车辆信息,保时捷carplay插了没反应,保时捷carplay怎么连不上...

热门文章

  1. SQL中JOIN操作后接ON和WHERE关键字的区别
  2. Windows 创建 Redis 和 zookeeper 系统服务
  3. linux安装Linux下软件的安装与卸载方法
  4. mysql 5.7 无法启动 服务没有报告任何错误
  5. Vuebnb 一个用 vue.js + Laravel 构建的全栈应用
  6. Linq系列(5)——表达式树之案例应用
  7. 了解Linux操作系统的引导过程
  8. Ubuntu上面安装Mongo
  9. 分享一个安全实现JSONP跨域的插件
  10. Windows Phone 7 检查手机网络