Java实现 LeetCode 639解码方法 2(递推)
639. 解码方法 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’。
PS:
复杂的递推
class Solution {
public static int numDecodings(String s) {
if(s == null || s.length() == 0)
return 0;
if(s.length() == 1)
return s.charAt(0) == '0' ? 0 : s.charAt(0) == '*' ? 9 : 1;
if(s.charAt(0) == '0')
return 0;
char[] chars = s.toCharArray();
long[] dp = new long[s.length() + 1];
dp[0] = 1;
dp[1] = chars[0] == '*' ? 9 : 1;
for(int i = 2; i <= chars.length ; i ++){
char first = chars[i - 2]; //表示第i - 1个字符
char second = chars[i - 1]; //表示第i个字符
//对于dp[i - 1]
if(second == '*')
dp[i] += 9 * dp[i - 1];
else if(second > '0')
dp[i] += dp[i - 1];
//对于dp[i - 2]
if(first == '*'){
if(second == '*') {
//26-10-1 *不能代替0
dp[i] += 15 * dp[i - 2];
}else if(second <= '6')
//11-26只有1 2两种选择
dp[i] += 2 * dp[i - 2];
else//都不是的话只能是1
dp[i] += dp[i - 2];
}else if(first == '1' || first == '2'){
if(second == '*'){
//11-19 或者21-26
dp[i] += first == '1' ? 9 * dp[i - 2] : 6 * dp[i - 2];
}else if((first - '0') * 10 + second - '0' <= 26){
//或者直接是死的
dp[i] += dp[i - 2];
}
}
dp[i] %= 1000000007;
}
return (int)dp[s.length()];
}
}
Java实现 LeetCode 639解码方法 2(递推)的更多相关文章
- Leetcode 639.解码方法2
解码方法2 一条包含字母 A-Z 的消息通过以下的方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 除了上述的条件以外,现在加密字符串可以包含字符 ' ...
- Java实现 LeetCode 91 解码方法
91. 解码方法 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 - 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总 ...
- 每日一题 LeetCode 486. 预测赢家 【递推】【前缀和】【动态规划】
题目链接 https://leetcode-cn.com/problems/predict-the-winner/ 题目说明 题解 主要方法:递推:动态规划:前缀和 解释说明: 求前缀和 pre_nu ...
- 每日一题 LeetCode 491. 递增子序列 【递推】【递增子序列】【动态规划】
题目链接 https://leetcode-cn.com/problems/increasing-subsequences/ 题目说明 题解 主要方法:递推:动态规划 解释说明: 数据表示:观察数据范 ...
- 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给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 : 输 ...
- 微软面试题: LeetCode 91. 解码方法 出现次数:3
题目描述: 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1'B' -> 2...'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 ...
- 生成器的send方法、递推函数、匿名函数及常用内置函数
生成器的send方法 在使用yield方法创建生成器时,不仅可以使用next方法进行取值,还可以通过send方法向生成器的内部传值 什么是send方法? send方法相当于高级的next方法,send ...
随机推荐
- 【Hadoop离线基础总结】oozie的安装部署与使用
目录 简单介绍 概述 架构 安装部署 1.修改core-site.xml 2.上传oozie的安装包并解压 3.解压hadooplibs到与oozie平行的目录 4.创建libext目录,并拷贝依赖包 ...
- CentOS8 右键打开后没有终端
最近研究CentOS8 发现右键打开后没有终端这一项: 1.经过查询发现是没有安装一个包 2.使用命令进行安装并重启: [root@base ~]# yum -y install nautilus- ...
- Python单元测试框架:unittest(二)
一.直接使用TestCase 注意所有测试方法都需要以test开头.代码如下: import unittest class Test1(unittest.TestCase): @classmethod ...
- spring源码解析之前置知识点
本文是作者原创,版权归作者所有.若要转载,请注明出处. 最近在看spring源码,但是spring的体系太庞大了,在这里记录一下阅读源码中遇到知识点 @PostConstruct 被注解的方法,在对象 ...
- 00001- layui 表格的默认工具栏添加自定义按钮
首先定义table: var tableIns = table.render({ elem:'#businessUserListTable' ,url: ctx+'/business/business ...
- interface和abstract 的区别和相同点
在Java语言中,abstract class和interface是支持抽象类定义的两种机制. 不能创建abstract类的实例,然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例 ...
- vue-cli搭建vue项目
1 安装node,npm npm i node npmnode -v npm -v 2 查看webpack版本,这里要注意,webpack如果为4.0,可能不兼容vue-cli 先卸载 npm un ...
- Django操作cookie实例
cookie项目文件: templates模板: login.html {% load static %} <!DOCTYPE html> <html lang="en& ...
- uefi win10 Ubuntu 18的安装
uefi win10 Ubuntu 18的安装 (Ubuntu折腾的第一天) 安装时的踩坑记录
- python基本数据类型:字符串及其方法(一)
大小写转换类 方法一:capitalize()首字母大写字符串 name='hatusne miku' name1=name.capitalize() print(name,name1) 方法二:ti ...