LeetCode - Decode Ways
2016-01-04 11:19
267 查看
题目:
A message containing letters from
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message
it could be decoded as
The number of ways decoding
思路:
分情况讨论
1. 当前字符为0
1.1 前一个字符为0,3-9.
1.2 前一个字符为1,2
2. 当前字符非0
2.1 前一个字符为0,3-9
2.2 前一个字符为2,当前字符为7-9
2.3 余下情况
更简化一下:
A message containing letters from
A-Zis 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
1.1 前一个字符为0,3-9.
1.2 前一个字符为1,2
2. 当前字符非0
2.1 前一个字符为0,3-9
2.2 前一个字符为2,当前字符为7-9
2.3 余下情况
package dp; public class DecodeWays { public int numDecodings(String s) { int n; if (s == null || (n = s.length()) == 0) return 0; int[] dp = new int[n + 1]; dp[0] = 1; if (s.charAt(0) == '0') return 0; dp[1] = 1; for (int i = 2; i <= n; ++i) { if (s.charAt(i - 1) == '0') { if (s.charAt(i - 2) != '1' && s.charAt(i - 2) != '2') return 0; dp[i] = dp[i - 2]; } else if (s.charAt(i - 2) == '0' || s.charAt(i - 2) > '2' || (s.charAt(i - 2) == '2' && s.charAt(i - 1) > '6')) { dp[i] = dp[i - 1]; } else { dp[i] = dp[i - 1] + dp[i - 2]; } } return dp ; } public static void main(String[] args) { // TODO Auto-generated method stub DecodeWays d = new DecodeWays(); System.out.println(d.numDecodings("10") == 1); System.out.println(d.numDecodings("101") == 1); System.out.println(d.numDecodings("1001") == 0); System.out.println(d.numDecodings("10012") == 0); System.out.println(d.numDecodings("0012") == 0); System.out.println(d.numDecodings("12") == 2); System.out.println(d.numDecodings("128") == 2); System.out.println(d.numDecodings("27") == 1); System.out.println(d.numDecodings("99") == 1); } }
更简化一下:
package dp; public class DecodeWays { public int numDecodings(String s) { int n; if (s == null || (n = s.length()) == 0) return 0; int[] dp = new int[n + 1]; dp[0] = 1; if (s.charAt(0) == '0') return 0; dp[1] = 1; for (int i = 2; i <= n; ++i) { int c1 = 0; if (s.charAt(i - 1) != '0') c1 = dp[i - 1]; int c2 = 0; if (s.charAt(i - 2) == '1' || (s.charAt(i - 2) == '2' && s.charAt(i - 1) < '7')) c2 = dp[i - 2]; dp[i] = c1 + c2; } return dp ; } public static void main(String[] args) { // TODO Auto-generated method stub DecodeWays d = new DecodeWays(); System.out.println(d.numDecodings("10") == 1); System.out.println(d.numDecodings("101") == 1); System.out.println(d.numDecodings("1001") == 0); System.out.println(d.numDecodings("10012") == 0); System.out.println(d.numDecodings("0012") == 0); System.out.println(d.numDecodings("12") == 2); System.out.println(d.numDecodings("128") == 2); System.out.println(d.numDecodings("27") == 1); System.out.println(d.numDecodings("99") == 1); } }
相关文章推荐
- 制作U盘系统启动盘并使用其重装系统
- 孩子忧伤时我们家长该怎么做?
- String.valueof(null) 与 String.valueof((Object)null)
- 火星坐标转百度坐标
- 单例模式
- 介绍Unreal Engine 4中的接口(Interface)使用C++和蓝图
- NSTimer你真的会用了吗??
- vs2010配置opencv 找不到cv.h
- HttpClient学习整理
- 第二次阅读笔记:读构建之法全书
- javascript进击(六)Jquery
- Scrum使用心得 【转】
- WM_COMMAND 和 WM_NOTIFY 的区别
- 利用n和nvm管理Node的版本
- Nginx reopen reload作用及工作过程
- Opencv2.4.9源码分析——HoughCircles
- (转)【java】String类和StringBuffer类常用操作
- Android分辨率
- javascript 从定义到执行,你不知道的那些事
- 设计模式:6)原型设计模式