之前只是知道动态规划是通过组合子问题来解决原问题的,但是如何分析,如何应用一直都是一头雾水。最近在leetcode中发现有好几道题都可以用动态规划方法进行解决,就此做下笔录。

动态规划:应用于子问题重叠情况,原问题的多个子问题间可能含有相同的子子问题,当然,关于将原问题分解成子问题的思路,分治算法也是可行的,但是如果采用分治递归来解决就会出现一些问题。在重复的子问题的计算中,分治算法会忽略到重复问题,也就是说相同的问题,分治算法会计算多次,这样效率会很低。而动态规划算法会仔细安排求解顺序,对每个子问题只求解一次,并将结果保留下来,这样当遇到重复问题,只需查找保存结果,无需重新计算。

动态规划有两种等价的实现方法:

1.带备忘的自顶向下法。

2.自底向上法。

LeetCode题目---Decode Ways:

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

'A' -> 1
'B' -> 2
...
'Z' -> 26

Given an encoded message containing digits, determine the total number of ways to decode it.

For example,
Given encoded message "12", it could be decoded as "AB" (1 2) or "L" (12).

The number of ways decoding "12" is 2.

分析:

边界条件:

1. 输入字符串长度为0时,则为0

2. 输入字符串的第一个数不能为0,若为0,则为0

根据例子我们可以知道问题可以分解成sum[i]=sum[i-1]+sum[i-2](i>1).

可以采用自底向上法的思想,有顺的将子问题有小到大进行求解。

代码如下:

public int numDecodings(String s) {
if(0 == s.length()) return 0;
if(s.charAt(0)=='0') return 0;
int []num = new int[s.length()];//记录遍历到字符串第i位置时的状态(该状态指的是编码的方法数)
num[0] = 1;
for(int i=1;i<s.length();i++){
if(s.charAt(i) != '0') num[i] = 1;
String temp = s.substring(i-1, i+1);
if(temp.charAt(0)=='0') continue;
if(Integer.parseInt(temp)>0&&Integer.parseInt(temp)<27){
if(1==i){
num[i]+=1;
}else{
num[i]+=num[i-2];
}
}
}
return num[s.length()-1];
}

当然leetcode中不只一道用到动态规划的思想,后续会再总结其他题目。

动态规划以及在leetcode中的应用的更多相关文章

  1. leetcode笔记 动态规划在字符串匹配中的应用

    目录 leetcode笔记 动态规划在字符串匹配中的应用 0 参考文献 1. [10. Regular Expression Matching] 1.1 题目 1.2 思路 && 解题 ...

  2. Leetcode中字符串总结

    本文是个人对LeetCode中字符串类型题目的总结,纯属个人感悟,若有不妥的地方,欢迎指出. 一.有关数字 1.数转换 题Interger to roman和Roman to integer这两题是罗 ...

  3. leetcode中,代码怎样调试,创造本地执行环境

    初次接触leetcode,是我在一个招聘站点上看的,这个OJ真有那么厉害吗? 这几天在这个OJ上做了几道题,发现他的几个特点,1.题目不难(相对于ACM来说,我被ACM虐到至今无力),评判没那么苛刻, ...

  4. 用Javascript方式实现LeetCode中的算法(更新中)

    前一段时间抽空去参加面试,面试官一开始让我做一道题,他看完之后,让我回答一下这个题的时间复杂度并优化一下,当时的我虽然明白什么是时间复杂度,但不知道是怎么计算的,一开局出师不利,然后没然后了,有一次我 ...

  5. LeetCode202:Happy Number 。C#版,在vs2010中通过,leetcode中Wrong Answer

    static List<int> nums = new List<int>(); public static bool IsHappy(int n) { int newint ...

  6. 2.3在LeetCode中使用我们自定义的类

    在上一节中我们使用的是java提供了的类,这一小节中我们就来学习一下如何在LeetCode中使用我们自定义的类. 其实很简单,我们只需把我们编写的自定义类,拷贝到LeetCode提供的类中,形成类中类 ...

  7. leetcode中一些要用到动态规划的题目

    需要仔细回顾的题目: 1.Interleaving String   交叉存取字符串 2.Decode Ways   字符串解码 3.Subsets   Subsets II          求一个 ...

  8. 关于leetcode中链表中两数据相加的程序说明

    * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ ...

  9. 二叉树系列 - 二叉搜索树 - [LeetCode] 中序遍历中利用 pre节点避免额外空间。题:Recover Binary Search Tree,Validate Binary Search Tree

    二叉搜索树是常用的概念,它的定义如下: The left subtree of a node contains only nodes with keys less than the node's ke ...

随机推荐

  1. Oracle数据库的启动和关闭

    深刻理解Oracle数据库的启动和关闭 Oracle数据库提供了几种不同的数据库启动和关闭方式,本文将详细介绍这些启动和关闭方式之间的区别以及它们各自不同的功能. 一.启动和关闭Oracle数据库 对 ...

  2. javascript 多行字符串

    javascript 字符串多行 平时一般使用 字符串+,或者[].join('')的方式 同事推荐了这样的形式 ExceptionDivHtml="<div class='gameI ...

  3. mysql函数操作(4)

    <?php ... $query = "INSERT INTO contactInfo (name, address, phone) VALUES (?, ?, ?)"; $ ...

  4. 无线功率 mW 和 dBm 的换算

    无线电发射机输出的射频信号,通过馈线(电缆)输送到天线,由天线以电磁波形式辐射出去.电磁波到达接收地点后,由天线接收下来(仅仅接收很小很小一部分功率),并通过馈线送到无线电接收机.因此在无线网络的工程 ...

  5. Android之CookieStore的持久化

    CookieStore是一个对象,有的服务端 ,比如.net,保持登录状态不是用httpclient.addHeader(“cookie”,SessionId),而是用httppost.setCook ...

  6. brief InformationTechnology theory of evolution

    信息技术进化论简述 无文化流氓帮帮主Ruiy Pk 清华土匪帮帮主YiC 1,按人机交互方式 命令行-->图形界面-->自然交互(语音+手控) Tips:命令行(IBM大型机,小型机+ S ...

  7. python 【第三篇】:函数及参数

    函数背景 在学习函数之前,一直遵循:面向过程编程: 根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代码块复制到现需功能处,如下: ...

  8. java--jsp+ssh+select动态结合数据和选择(解)

    在三层体系结构和jsp合并项目,如何实现select动态绑定数据和动态选择指定的行?让我们来看看下面的: 1.首先定义一个Bean分类.它用于实例select的结合数据中的每一个id和name: pu ...

  9. 解决Android中TextView首行缩进的问题

    方式一:(推荐) setText("\u3000\u3000"+xxxxx); 方式二:这种方式不同分辨率会有问题 setText(""+xxxxx); 半角: ...

  10. My97DaePicker 用js实现文本框日期相减求天数

    <tr>                <td align="center" style="background-color: #cccccc;font ...