Decode Ways -- LeetCode
原题链接: http://oj.leetcode.com/problems/decode-ways/
这道题要求解一个数字串依照字符串编码方式可解析方式的数量。看到这样的求数量的,我们非常easy想到动态规划来存储前面信息,然后迭代得到最后结果。
我们维护的量res[i]是表示前i个数字有多少种解析的方式,接下来来想想递归式,有两种方式:第一种新加进来的数字不然就是自己比較表示一个字符,那么解析的方式有res[i-1]种,另外一种就是新加进来的数字和前一个数字凑成一个字符,解析的方式有res[i-2]种(由于上一个字符和自己凑成了一个)。当然这里要推断前面说的两种情况是否能凑成一个字符,也就是范围的推断,假设能够才有相应的解析方式,假设不行,那么就是0。终于结果就是把这两种情况相应的解析方式相加。这里能够把范围分成几个区间:
(1)00:res[i]=0(无法解析,没有可行解析方式);
(2)10, 20:res[i]=res[i-2](仅仅有另外一种情况成立);
(3)11-19, 21-26:res[i]=res[i-1]+res[i-2](两种情况都可行);
(4)01-09, 27-99:res[i]=res[i-1](仅仅有第一种情况可行);
递推式就是依照上面的规则来得到,接下来我们仅仅要进行一遍扫描,然后依次得到维护量就能够了,算法的时间复杂度是O(n)。空间上能够看出我们每次仅仅须要前两位的历史信息,所以仅仅须要维护三个变量然后迭代赋值就能够了,所以空间复杂度是O(1)。代码例如以下:
public int numDecodings(String s) {
if(s==null || s.length()==0 || s.charAt(0)=='0')
{
return 0;
}
int num1=1;
int num2=1;
int num3=1;
for(int i=1;i<s.length();i++)
{
if(s.charAt(i)=='0')
{
if(s.charAt(i-1)=='1' || s.charAt(i-1)=='2')
num3 = num1;
else
return 0;
}
else
{
if(s.charAt(i-1)=='0' || s.charAt(i-1)>='3')
num3 = num2;
else
{
if(s.charAt(i-1)=='2' && s.charAt(i)>='7' && s.charAt(i)<='9')
num3 = num2;
else
num3 = num1+num2;
}
}
num1 = num2;
num2 = num3;
}
return num2;
}
这道题是一维动态规划的题目,递推式关系来说是比較easy得到的,主要是要对这些两位数进行划分有一些细节,easy出小错误。
Decode Ways -- LeetCode的更多相关文章
- Decode Ways leetcode java
题目: A message containing letters from A-Z is being encoded to numbers using the following mapping: ' ...
- [LeetCode] Decode Ways 解码方法
A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...
- leetcode@ [91] Decode Ways (Dynamic Programming)
https://leetcode.com/problems/decode-ways/ A message containing letters from A-Z is being encoded to ...
- leetcode面试准备:Decode Ways
1 题目 A message containing letters from A-Z is being encoded to numbers using the following mapping: ...
- [LeetCode] Decode Ways II 解码方法之二
A message containing letters from A-Z is being encoded to numbers using the following mapping way: ' ...
- leetcode 91 Decode Ways I
令dp[i]为从0到i的总方法数,那么很容易得出dp[i]=dp[i-1]+dp[i-2], 即当我们以i为结尾的时候,可以将i单独作为一个字母decode (dp[i-1]),同时也可以将i和i-1 ...
- 动态规划小结 - 一维动态规划 - 时间复杂度 O(n),题 [LeetCode] Jump Game,Decode Ways
引言 一维动态规划根据转移方程,复杂度一般有两种情况. func(i) 只和 func(i-1)有关,时间复杂度是O(n),这种情况下空间复杂度往往可以优化为O(1) func(i) 和 func(1 ...
- LeetCode解题报告—— Word Search & Subsets II & Decode Ways
1. Word Search Given a 2D board and a word, find if the word exists in the grid. The word can be con ...
- Leetcode 91. Decode Ways 解码方法(动态规划,字符串处理)
Leetcode 91. Decode Ways 解码方法(动态规划,字符串处理) 题目描述 一条报文包含字母A-Z,使用下面的字母-数字映射进行解码 'A' -> 1 'B' -> 2 ...
随机推荐
- 编程书籍分享--pdf
作为程序员,我觉得我们应该多学习.多思考.多分享. 今天就花费了一点时间把这几年搜集的编程资料上传到了网上做个分享, 其中涵盖.net .java.js.html5.css3.mysql.sqlser ...
- #ifndef#define#endif的用法-b
The special operator defined is used in #if and #elif expressions to test whether a certain name is ...
- 解决Android SDK Manager更新(一个更新Host的程序的原理实现和源码)
<ignore_js_op> 同学遇到了更新Android SDK的问题,而且Goagent现在也无法用来更新.就想到了用替代Host的方法,添加可用的谷歌地址来实现更新. ...
- php常用函数集
网络请求: /** * 发起HTTPS请求 */ function curl_post($url,$data=null,$header=null,$post=0) { //初始化curl $ch = ...
- 解决nginx 504 Gateway Time-out的一些方法
在CentOS下配置lnmp组合基本上用的都是同样的配置文件,一直都没出现过问题,可最近在一个vps上安装同样的环境之后,网站在线10多人就出 现了打开速度非常缓慢的情况,有好几次都是直接达到了ngi ...
- Spring 3整合Quartz 1实现定时任务一:常规整合(基于maven构建)
Spring配置Quartz例子(基于maven构建) 在Spring中使用Quartz有两种方式实现:第一种是任务类继承QuartzJobBean,第二种则是在配置文件里定义任务类和要执行的方法,类 ...
- Java多线程初学者指南(9):为什么要进行数据同步
Java中的变量分为两类:局部变量和类变量.局部变量是指在方法内定义的变量,如在run方法中定义的变量.对于这些变量来说,并不存在线程之间共享的问题.因此,它们不需要进行数据同步.类变量是在类中定义的 ...
- How to new a screen in linux
screen -R -D: create a screen Ctrl + A & Ctrl + D: leave a screen
- Matlab中Rand()函数用法
一.理论准备 matlab函数randn:产生均值为0,方差 σ^2 = 1,标准差σ = 1的正态分布的随机数或矩阵的函数. 用法:Y = randn(n),返回一个n*n的随机项的矩阵.如果n不是 ...
- 【HDU 3810】 Magina (01背包,优先队列优化,并查集)
Magina Problem Description Magina, also known as Anti-Mage, is a very cool hero in DotA (Defense of ...