博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode Decode Ways
阅读量:5329 次
发布时间:2019-06-14

本文共 2156 字,大约阅读时间需要 7 分钟。

原题链接在这里:

题目:

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.

题解:

DP题. 要求的是decode的方法. 需要保留的历史信息是到当前字符decode的方法. 用array保存.

递推和等台阶的题目很像. 以"321" 为例,到了第三位时,  s.substring(i-1, i) = "1"是 valid的, s.substring(i-2, i) = "21" 也是valid的.

dp[i] = dp[i-1] + dp[i-2]. 

答案是dp[dp.length-1].

初始化用到前两个, 所以要有两个base case. dp[0] = 1. dp[1]看第一个字符是否是'0', 若不是, dp[0]=1.

Note: 0 非常烦人. 若是string 是"09","10",  对应的数字9, 10都在1到26之间,但“0”根本就不能decode, 所以任何包含 "0"的字符串都是非法的, return false.

Time Complexity: O(n). Space: O(n). n = s.length().

AC Java:

1 public class Solution { 2     public int numDecodings(String s) { 3         if(s == null || s.length() == 0){ 4             return 0; 5         } 6         int [] dp = new int[s.length()+1]; 7         dp[0] = 1; 8         dp[1] = isValid(s.substring(0,1)) ? 1 : 0; 9         10         for(int i = 2; i
= 1 && Integer.valueOf(s) <= 26;26 }27 }

只用到前面两个历史值. 可以降维处理.

Time Complexity: O(s.length()). Space: O(1).

AC Java:

1 public class Solution { 2     public int numDecodings(String s) { 3         if(s == null || s.length() == 0){ 4             return 0; 5         } 6          7         int first = 1; 8         int second = isValid(s.substring(0,1)) ? 1 : 0; 9         10         for(int i = 2; i<=s.length(); i++){11             int third = 0;12             if(isValid(s.substring(i-1, i))){13                 third += second;14             }15             if(isValid(s.substring(i-2, i))){16                 third += first;17             }18             19             first = second;20             second = third;21         }22         return second;23     }24     25     private boolean isValid(String s){26         if(s.charAt(0) == '0'){27             return false;28         }29         return Integer.valueOf(s) >= 1 && Integer.valueOf(s) <= 26;30     }31 }

跟上.

转载于:https://www.cnblogs.com/Dylan-Java-NYC/p/4824951.html

你可能感兴趣的文章
界面交互之支付宝生活圈pk微信朋友圈
查看>>
[DLX精确覆盖+打表] hdu 2518 Dominoes
查看>>
SuperMap iServerJava 6R扩展领域开发及压力测试---判断点在那个面内(1)
查看>>
Week03-面向对象入门
查看>>
一个控制台程序,模拟机器人对话
查看>>
web.xml 中加载顺序
查看>>
pycharm激活地址
查看>>
hdu 1207 四柱汉诺塔
查看>>
Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(上篇——纯前端多页面)
查看>>
display:none与visible:hidden的区别
查看>>
我的PHP学习之路
查看>>
【题解】luogu p2340 奶牛会展
查看>>
对PostgreSQL的 SPI_prepare 的理解。
查看>>
解决响应式布局下兼容性的问题
查看>>
京东静态网页练习记录
查看>>
使用DBCP连接池对连接进行管理
查看>>
【洛谷】【堆+模拟】P2278 操作系统
查看>>
hdu3307 欧拉函数
查看>>
Spring Bean InitializingBean和DisposableBean实例
查看>>
Solr4.8.0源码分析(5)之查询流程分析总述
查看>>