(Version 0.0)

Decode Ways这道题从原理上说是一个比较简单的一维DP题目,用一个一维数组的元素dp[i] (i >= 1)来记录从头开始长度为i的substring有多少种decode ways。

不过实际操作起来第一次写还是在输入为"0"时犯了错误,另外第一次写的时候没有意识到当可以构成"10"和"20"时dp[i]要等于dp[i - 2],而不能取dp[i - 1] + dp[i - 2],另外一个易错点是对于dp[0]的初始化,应该为1而不是0。整体感觉这题只要是有DP的思维就不难,但是要考虑清楚各种情况的取舍以及corner case。代码如下:

 1 public class Solution {
 2     public int numDecodings(String s) {
 3         if (s.length() < 2) {
 4             return s.equals("0") ? 0 : s.length(); // don't forget to check if s is "0"
 5         }
 6         int[] dp = new int[s.length() + 1];
 7         dp[0] = 1; // be careful with this initialization
 8         dp[1] = s.charAt(0) == '0' ? 0 : 1;
 9         for (int i = 2; i < dp.length; i++) {
10             int val = Integer.valueOf(s.substring(i - 2, i));
11             if (val == 0) {
12                 return 0;
13             } else if (val <= 9) {
14                 dp[i] = dp[i - 1];
15             } else if (val < 27) {
16                 if (val % 10 == 0) {
17                     dp[i] = dp[i - 2];
18                 } else {
19                     dp[i] = dp[i - 1] + dp[i - 2];
20                 }
21             } else {
22                 if (val % 10 == 0) {
23                     return 0;
24                 } else {
25                     dp[i] = dp[i - 1];
26                 }
27             }
28         }
29         return dp[dp.length - 1];
30     }
31 }

循环内的思路大致是,如果当前char不能和前一个char组成合法数字时,dp[i] = dp[i - 1];如果当前char为0且前一个也为0或者前一个char大于2,则此decoding invalid,可以直接返回0;如果当前char可以和前一个char组成合法数字,则需要把前两个dp中的元素相加作为当前元素的值,因为在之前的子串上加上当前char可以增添两种可能性,即与前一个char结合或者不结合,如果结合,则有dp[i - 2]种,不结合则有dp[i - 1]种,所以总共是dp[i - 1] + dp[i - 2]种。

转载于:https://www.cnblogs.com/icecreamdeqinw/p/4325487.html

[LeetCode] Decode Ways相关推荐

  1. [leetcode]Decode Ways

    动态规划.要注意way+=dp[i-1]或dp[i-2]以及way+=1的条件.我看有的人把数组命名为count的. public class Solution {public int numDeco ...

  2. LeetCode Decode Ways(动态规划)

    题意:编码方式为a->1,...z->26,给出编码后的数字字符串,问有多种编码方式 思路:用dp(i)表示从第1个字符到第i个字符时的编码方式,因为编码一个字符时,只能是0-9,编码两个 ...

  3. LeetCode Decode Ways

    有点意思的题目.用动态规划能够O(n)求解出来:a[i]代表子字符串string(0,i)的可能解码方式,a[i] = {a[i-1] or a[i-1]+a[i-2]}. 意思是假设string(i ...

  4. 【重点!DP】LeetCode 639. Decode Ways II

    LeetCode 639. Decode Ways II 参考网址:https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-639-d ...

  5. 【DFS + 记忆化递归 + DP】LeetCode 91. Decode Ways

    LeetCode 91. Decode Ways Solution1:我的答案 还是记录一下,最容易想到的是DFS,但是在第223/238个case上就超时了... class Solution { ...

  6. [LeetCode]91.Decode Ways

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

  7. 【LeetCode】91. Decode Ways 解题报告(Python)

    [LeetCode]91. Decode Ways 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fux ...

  8. Decode Ways leetcode java

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

  9. 91 Decode Ways

    为什么我常常对做题产生恐惧,因为可能为了一个不算难的问题不知不觉绕进去2个小时,这显然是不值得的.这题就是如此. 还要注意,java && 的优先级高于||的优先级,而不是同级. pu ...

最新文章

  1. 深入理解SpringCloud之配置刷新
  2. Element 'dependency' cannot have character [children], because the type's content type is element-on
  3. Tomcat虚拟目录的配置
  4. TensorFlow 1.12.2 发布,修复 GIF 构造安全漏洞
  5. idea 执行 java jar_idea打包java可执行jar包的实现步骤
  6. Magento创建多语言店铺的方法
  7. MATLAB函数 zp2tf详解
  8. 拼多多上市关你什么事?
  9. matlab肆,matlab入门教程
  10. SoapUI接口测试断言
  11. OS + Win Office / word / excel / ppt / powerpoint / keyboard_shortcut
  12. Treap树应用-bzoj 1862 GameZ游戏排名系统问题
  13. 以大TMS运输配送管理系统
  14. 2021-05-11 MongoDB面试题 MongoDb中索引是什么
  15. 大数据学习一般学什么
  16. 套路(Jony J)
  17. MySQL之主键ID生成策略
  18. 个人简历--软件工程师 4年
  19. YII2.0的I18N/L10N是干什么的?是如何工作的?底层原理是什么?
  20. 数据分析工程师需要考虑的问题

热门文章

  1. 怎么一步步编写简单的PHP的Framework(五)
  2. how to write academic english well?
  3. pdf expert for Mac分享 支持m1
  4. Unity架构有点乱
  5. 【每日一包0015】gradient-string
  6. Tower-web 0.3.1/2 发布,类型完善和修复更新
  7. MySQL迁移过程中遇到的问题
  8. MySQL · 源码分析 · 一条insert语句的执行过程
  9. tablelayout的使用
  10. Android存储访问及目录