Leetcode 639.解码方法2
解码方法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, 105]。
- 输入的字符串只会包含字符 '*' 和 数字'0' - '9'。
- 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];
- }
- }
第一步
第二步
第三步
第四步
第五步
第六步
第七步
第八步
- 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()];
- }
- }
Leetcode 639.解码方法2的更多相关文章
- Java实现 LeetCode 639解码方法 2(递推)
639. 解码方法 2 一条包含字母 A-Z 的消息通过以下的方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 除了上述的条件以外,现在加密字符串可以 ...
- leetcode 91. 解码方法 JAVA
题目: 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数. ...
- leetcode 91. 解码方法
题目描述: 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数 ...
- 【LeetCode】解码方法
[问题] 一条包含字母 A-Z 的消息通过以下方式进行了编码:'A' -> 1'B' -> 2…'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 : 输 ...
- Java实现 LeetCode 91 解码方法
91. 解码方法 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 - 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总 ...
- 微软面试题: LeetCode 91. 解码方法 出现次数:3
题目描述: 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1'B' -> 2...'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 ...
- [LeetCode] 639. Decode Ways II 解码方法 II
A message containing letters from A-Z is being encoded to numbers using the following mapping way: ' ...
- [LeetCode] Decode Ways 解码方法
A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...
- [LeetCode] Decode Ways II 解码方法之二
A message containing letters from A-Z is being encoded to numbers using the following mapping way: ' ...
随机推荐
- nginx搭建流媒体服务器
1.安装PCRE库 到www.pcre.org 下载pcre-8.37.tar.gz tar -zxvf pcre-8.37.tar.gz cd pcre-8.37 ./configure make ...
- IOS UIImageView的帧动画
● UIImageView可以让一系列的图片在特定的时间内按顺序显示 ● 相关属性解析: ● animationImages:要显示的图片(一个装着UIImage的NSArray) ● animati ...
- 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 ...
- Android(java)学习笔记82:利用SpannableString设置复合文本
1. SpannableString设置复合文本: TextView通常用来显示普通文本,但是有时候需要对其中某些文本进行样式.事件方面的设置.Android系统通过SpannableString类来 ...
- python_72_json序列化2
#序列化(json是最正规的) import json info={ 'name':'Xue Jingjie', 'age':22 } f=open('第72.text','w') print(jso ...
- ETL工具--DataX3.0实战
DataX是一个在异构的数据库/文件系统之间高速交换数据的工具,实现了在任意的数据处理系统(RDBMS/Hdfs/Local filesystem)之间的数据交换,由淘宝数据平台部门完成. DataX ...
- javaweb基础(34)_jdbc处理mysql大数据
一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...
- IOS后台执行
大多数应用程序进入后台状态不久后转入暂停状态.在这种状态下,应用程序不执行任何代码,并有可能在任意时候从内存中删除.应用程序提供特定的服务,用户可以请求后台执行时间,以提供这些服务. 判断是否支持多线 ...
- C/C++ 程序基础 (一)基本语法
域操作符: C++ 支持通过域操作符访问全局变量,C不支持(识别为重定义) ++i和i++的效率分析: 内置类型,无区别 自定义数据类型,++i可以返回引用,i++只能返回对象值(拷贝开销) 浮点数与 ...
- Mybatis 插入一条或批量插入 返回带有自增长主键记录
首先讲一下, 插入一条记录返回主键的 Mybatis 版本要求低点,而批量插入返回带主键的 需要升级到3.3.1版本,3.3.0之前的都不行, <dependency> <grou ...