解码方法2

一条包含字母 A-Z 的消息通过以下的方式进行了编码:

'A' -> 1

'B' -> 2

...

'Z' -> 26

除了上述的条件以外,现在加密字符串可以包含字符 '*'了,字符'*'可以被当做1到9当中的任意一个数字。

给定一条包含数字和字符'*'的加密信息,请确定解码方法的总数。

同时,由于结果值可能会相当的大,所以你应当对109 + 7取模。(翻译者标注:此处取模主要是为了防止溢出)

示例 1 :

输入: "*"

输出: 9

解释: 加密的信息可以被解密为: "A", "B", "C", "D", "E", "F", "G", "H", "I".

示例 2 :

输入: "1*"

输出: 9 + 9 = 18(翻译者标注:这里1*可以分解为1,* 或者当做1*来处理,所以结果是9+9=18)

说明 :

  1. 输入的字符串长度范围是 [1, 105]。
  2. 输入的字符串只会包含字符 '*' 和 数字'0' - '9'。

  1. public class Solution {
  2. int M = 1000000007;
  3. public int numDecodings(String s) {
  4. Integer[] memo=new Integer[s.length()];
  5. return ways(s, s.length() - 1,memo);
  6. }
  7. public int ways(String s, int i,Integer[] memo) {
  8. if (i < 0)
  9. return 1;
  10. if(memo[i]!=null)
  11. return memo[i];
  12. if (s.charAt(i) == '*') {
  13. long res = 9 * ways(s, i - 1,memo);
  14. if (i > 0 && s.charAt(i - 1) == '1')
  15. res = (res + 9 * ways(s, i - 2,memo)) % M;
  16. else if (i > 0 && s.charAt(i - 1) == '2')
  17. res = (res + 6 * ways(s, i - 2,memo)) % M;
  18. else if (i > 0 && s.charAt(i - 1) == '*')
  19. res = (res + 15 * ways(s, i - 2,memo)) % M;
  20. memo[i]=(int)res;
  21. return memo[i];
  22. }
  23. long res = s.charAt(i) != '0' ? ways(s, i - 1,memo) : 0;
  24. if (i > 0 && s.charAt(i - 1) == '1')
  25. res = (res + ways(s, i - 2,memo)) % M;
  26. else if (i > 0 && s.charAt(i - 1) == '2' && s.charAt(i) <= '6')
  27. res = (res + ways(s, i - 2,memo)) % M;
  28. else if (i > 0 && s.charAt(i - 1) == '*')
  29. res = (res + (s.charAt(i)<='6'?2:1) * ways(s, i - 2,memo)) % M;
  30. memo[i]= (int)res;
  31. return memo[i];
  32. }
  33. }

第一步

第二步

第三步

第四步

第五步

第六步

第七步

第八步

  1. public class Solution {
  2. int M = 1000000007;
  3. public int numDecodings(String s) {
  4. long[] dp = new long[s.length() + 1];
  5. dp[0] = 1;
  6. dp[1] = s.charAt(0) == '*' ? 9 : s.charAt(0) == '0' ? 0 : 1;
  7. for (int i = 1; i < s.length(); i++) {
  8. if (s.charAt(i) == '*') {
  9. dp[i + 1] = 9 * dp[i];
  10. if (s.charAt(i - 1) == '1')
  11. dp[i + 1] = (dp[i + 1] + 9 * dp[i - 1]) % M;
  12. else if (s.charAt(i - 1) == '2')
  13. dp[i + 1] = (dp[i + 1] + 6 * dp[i - 1]) % M;
  14. else if (s.charAt(i - 1) == '*')
  15. dp[i + 1] = (dp[i + 1] + 15 * dp[i - 1]) % M;
  16. } else {
  17. dp[i + 1] = s.charAt(i) != '0' ? dp[i] : 0;
  18. if (s.charAt(i - 1) == '1')
  19. dp[i + 1] = (dp[i + 1] + dp[i - 1]) % M;
  20. else if (s.charAt(i - 1) == '2' && s.charAt(i) <= '6')
  21. dp[i + 1] = (dp[i + 1] + dp[i - 1]) % M;
  22. else if (s.charAt(i - 1) == '*')
  23. dp[i + 1] = (dp[i + 1] + (s.charAt(i) <= '6' ? 2 : 1) * dp[i - 1]) % M;
  24. }
  25. }
  26. return (int) dp[s.length()];
  27. }
  28. }

Leetcode 639.解码方法2的更多相关文章

  1. Java实现 LeetCode 639解码方法 2(递推)

    639. 解码方法 2 一条包含字母 A-Z 的消息通过以下的方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 除了上述的条件以外,现在加密字符串可以 ...

  2. leetcode 91. 解码方法 JAVA

    题目: 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数. ...

  3. leetcode 91. 解码方法

    题目描述: 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数 ...

  4. 【LeetCode】解码方法

    [问题] 一条包含字母 A-Z 的消息通过以下方式进行了编码:'A' -> 1'B' -> 2…'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 : 输 ...

  5. Java实现 LeetCode 91 解码方法

    91. 解码方法 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 - 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总 ...

  6. 微软面试题: LeetCode 91. 解码方法 出现次数:3

    题目描述: 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1'B' -> 2...'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 ...

  7. [LeetCode] 639. Decode Ways II 解码方法 II

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

  8. [LeetCode] Decode Ways 解码方法

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

  9. [LeetCode] Decode Ways II 解码方法之二

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

随机推荐

  1. nginx搭建流媒体服务器

    1.安装PCRE库 到www.pcre.org 下载pcre-8.37.tar.gz tar -zxvf pcre-8.37.tar.gz cd pcre-8.37 ./configure make ...

  2. IOS UIImageView的帧动画

    ● UIImageView可以让一系列的图片在特定的时间内按顺序显示 ● 相关属性解析: ● animationImages:要显示的图片(一个装着UIImage的NSArray) ● animati ...

  3. POJ 2429 GCD & LCM Inverse(Miller-Rabbin素性测试,Pollard rho质因子分解)

    x = lcm/gcd,假设答案为a,b,那么a*b = x且gcd(a,b) = 1,因为均值不等式所以当a越接近sqrt(x),a+b越小. x的范围是int64的,所以要用Pollard_rho ...

  4. Android(java)学习笔记82:利用SpannableString设置复合文本

    1. SpannableString设置复合文本: TextView通常用来显示普通文本,但是有时候需要对其中某些文本进行样式.事件方面的设置.Android系统通过SpannableString类来 ...

  5. python_72_json序列化2

    #序列化(json是最正规的) import json info={ 'name':'Xue Jingjie', 'age':22 } f=open('第72.text','w') print(jso ...

  6. ETL工具--DataX3.0实战

    DataX是一个在异构的数据库/文件系统之间高速交换数据的工具,实现了在任意的数据处理系统(RDBMS/Hdfs/Local filesystem)之间的数据交换,由淘宝数据平台部门完成. DataX ...

  7. javaweb基础(34)_jdbc处理mysql大数据

    一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...

  8. IOS后台执行

    大多数应用程序进入后台状态不久后转入暂停状态.在这种状态下,应用程序不执行任何代码,并有可能在任意时候从内存中删除.应用程序提供特定的服务,用户可以请求后台执行时间,以提供这些服务. 判断是否支持多线 ...

  9. C/C++ 程序基础 (一)基本语法

    域操作符: C++ 支持通过域操作符访问全局变量,C不支持(识别为重定义) ++i和i++的效率分析: 内置类型,无区别 自定义数据类型,++i可以返回引用,i++只能返回对象值(拷贝开销) 浮点数与 ...

  10. Mybatis 插入一条或批量插入 返回带有自增长主键记录

    首先讲一下,  插入一条记录返回主键的 Mybatis 版本要求低点,而批量插入返回带主键的 需要升级到3.3.1版本,3.3.0之前的都不行, <dependency> <grou ...