输入:一个字符串,只包含0-9的字符。
输出:解码种类
规则:有一种信息映射规则 A->1,B->2…Z->26。
例如输入’1’,只能解码为A。
输入’12’,可以解码为’AB’,也可以是’L’,有2种解码方式。
分析:这一个分析思路很自然,但是很麻烦,最后还是有逻辑漏洞(有漏洞是因为没有把情况考虑全了)。
向这种多阶段完成的题目已经做过很多,不假思索就是这样想的。
如果需要解码’12128’这个字符串,
如果只有1,一种解法:A
如果是12,可以看做1+2,也可以看做12。解码就是A+B,或者L。
如果是121,可以看做是12+1,也可以看做是1+21。
 如果是12+1,解法种类等于12的解法:2。
 如果是1+21,解法种类等于1的解法:1。
 最终结果是3。
如果是1212,可以看做是121+2,也可以看做是12+12。
 如果是121+2,解法种类等于121的解法:3。
 如果是12+12,解法种类等于12的解法:2。
 最终结果是5。
如果是12127,可以看做是1212+7,也可以看做是121+27?错了,27没有对应的字母,所以只有1212+7这一种。
 如果是1212+7,解法种类等于1212的解法:5。
看到这里其实动态转移方程已经出来了。

当s[i] !=0 的时候:
dp[i]=dp[i-1]+dp[i-2],这是当Number(i-1,i)<=26的时候。
dp[i]=dp[i-1] 这是当Number(i-1,i)>26的时候。

对0字符还没有考虑,0没有对应的字母,那结果是怎样的?
对于’012’,因为0没有对应直接返回0。也就是0在首位,直接返回0。
对于’10’,可以分解为10+2两个部分,解码为’JB’,答案为1。
对于’210’,可以分解为2+10两个部分,分解数量和’2’是一样的,也就是dp[i] = dp[i-2]。
对于’280’,没有分解策略,应该返回0。
对于’100’,分解为10+0不对,0没有映射,分解为1+00,同样不对,0还是没有映射。应该直接返回0。

当s[i] ==0的时候:
if Number(i-1,1)<=26,那么dp[i] = dp[i-2]。
if Number(i-1,1)>26,则返回0。
if 两个连续的0挨着,则返回0。
if 0在第0个位置,则无效,返回0。

这道题目和爬楼梯是一个类型,只是有更多的限制条件。需要将各种情况思考一遍。参考链接。

 public int numDecodings(String s) {if(s==null || s.length()==0 ) return 0;int  n = s.length();int[] dp = new int[n];if(s.charAt(0)=='0') return 0;dp[0] = 1;if(n>1){if(s.charAt(1)=='0'){if(s.charAt(0)=='0'){return 0;}else if((s.charAt(0) - '0')*10 + (s.charAt(1) - '0')<=26){dp[1] = dp[0];}else{return 0;}}else{dp[1] = (s.charAt(0) - '0')*10 + (s.charAt(1) - '0')<=26?dp[0]+1:1;}            }for(int i =2;i<n;i++){if(s.charAt(i)=='0'){if(s.charAt(i-1)!='0' && (s.charAt(i-1) - '0')*10 + (s.charAt(i) - '0')<=26){dp[i] = dp[i-2];}else {return 0;}}else{if(s.charAt(i-1)=='0'){dp[i] = dp[i-1];}else if( (s.charAt(i-1) - '0')*10 + (s.charAt(i) - '0')<=26){dp[i] = dp[i-1] +dp[i-2];}else{dp[i] = dp[i-1] ;}}}return dp[n-1];}

分析2:从后往前看。参考链接。

例子依然是字符串’12128’
8:解法总数(8)=1
28:2+8,解法总数(28)=解法总数(8)
128:1+count(‘28’),或者12+8,解法总数(128)=解法总数(28)+解法 总数(8)
2128: 2+128;21+count(28),解法总数(2128)=解法总数(128)+解法 总数(28)

字符串’012’
2
12: 12 或者 1+2
012:0和谁都不能分到一起解码,所以为0。

字符串 ‘100’
0:答案0
00 :答案 0
100:答案 0 因为前两步都是0

字符串’1002’

当字符中包含0,对于当前位置不等于0的来说,number(i,i+1)<=26的话,解法总数(i)=解法总数(i+1)+解法总数(i+2),和上面的规则是相符 的。这样来考虑就简单了许多。
这样从后向前考虑问题,以及对于0的处理,都是要学习的地方 。

 public int numDecodings(String s) {if(s==null || s.length()==0 ) return 0;int  n = s.length();int[] dp = new int[n+1];dp[n] = 1;dp[n-1] = s.charAt(n-1)=='0'?0:1;for(int i=n-2;i>=0;i--){if(s.charAt(i)=='0'){dp[i] = 0;}else if((s.charAt(i)-'0')*10 + (s.charAt(i+1)-'0')<=26){dp[i] = dp[i+1]+dp[i+2];}else{dp[i] = dp[i+1];}}return dp[0];}

[dp] LeetCode 91. Decode Ways相关推荐

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

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

  2. [LeetCode]91.Decode Ways

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

  3. LeetCode 91. Decode Ways

    问题链接 LeetCode 91 题目解析 A~Z对应数字1~26,给出一段数字串,求破译方法数. 解题思路 动态规划.关键在于分类,定义 \(dp[i]\) 为前i个字符的解密方法数,初始化为0. ...

  4. LeetCode 91 Decode Ways(编码方式)(*)

    原文 A message containing letters from A-Z is being encoded to numbers the following mapping: 'A' -> ...

  5. leetcode 91. Decode Ways | 91. 解码方法(动态规划)

    题目 https://leetcode.com/problems/decode-ways/ 题解 dp 问题,首先用模拟的办法试一下,理清楚状态转移关系. 当走到 i 位置时,i 有两种选择: i 不 ...

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

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

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

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

  8. 91 Decode Ways

    91 Decode Ways dp解法 O(1) space class Solution:# @param {string} s# @return {integer}def numDecodings ...

  9. 91 Decode Ways

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

最新文章

  1. 你不好奇缓冲池里的秘密吗?
  2. php curl选项列表(超详细)
  3. 【机器学习基础】一文看透多任务学习
  4. Round-Robin负载均衡算法及其实现原理
  5. CentOS7.0 安装 tomcat-9.0
  6. PHP随笔---简述var_dump()、print_r()、echo()
  7. arima模型_[不说人话系列]-ARIMA模型
  8. SpringBoot使用ResponseBodyAdvice进行统一响应处理
  9. 计算机考研高分扎堆学校如何处理,考研:名校400+扎堆,450+和数学满分频现,网友:这届太厉害了!...
  10. 序列化(串行化)- 使用BinaryFormatter进行序列化
  11. 英特尔加入 GPU 战局,终用上 6nm 工艺?
  12. UBT19:ubuntu安装qq与微信
  13. ABBYY FineReader OCR图片文字识别软件安装应用
  14. V-REP 插件教程
  15. python 以图搜图1688_python 以图搜图
  16. Python 阿拉伯数字转换成英文
  17. 华为荣耀畅享7的计算机在哪,华为畅享7有什么新功能_华为畅享7有哪些新功能-太平洋IT百科...
  18. saveFile()方法
  19. ###《High-level event recognition in unconstrained videos》
  20. 手机电子邮件用outlook登录

热门文章

  1. 为什么要进行归一化处理?(从寻找最优解这个角度讨论)
  2. 如何进行正确的SQL性能优化
  3. OpenCV人脸检测并把图片写成avi视频
  4. 计算机网络ieee,博士生程珂论文连续两年被计算机网络顶级会议IEEE INFOCOM录用...
  5. android系统的发展态势,2020年安卓手机发展的7个趋势,只有延伸,并无革命性的变化...
  6. 纯静态网站模板封装header和footer
  7. Android activity跳转动画,6种activity进入动画
  8. android 日期选择器
  9. sqlserver注释巧清理
  10. nginx.conf文件内容详解