leetcode面试准备:Decode Ways
2015-07-10 18:07
537 查看
1 题目
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.
接口:
public int numDecodings(String s);
2 思路
一维动态规划,偷懒了,照搬博文。分析:需要注意的是,如果序列中有不能匹配的0,那么解码方法是0,比如序列012 、100(第二个0可以和1组成10,第三个0不能匹配)。
递归的解法很容易,但是大集合会超时。转换成动态规划的方法,假设dp[i]表示序列s[0...i-1]的解码数目
动态规划方程如下:
初始条件:dp[0] = 1, dp[1] = (s[0] == '0') ? 0 : 1
dp[i] = ( s[i-1] == 0 ? 0 : dp[i-1] ) + ( s[i-2,i-1]可以表示字母 ? dp[i-2] : 0 ), 其中第一个分量是把s[0...i-1]末尾一个数字当做一个字母来考虑,第二个分量是把s[0...i-1]末尾两个数字当做一个字母来考虑
复杂度: Time O(n); Space O(n)
3 代码
public int numDecodings(String s) { // 1.初始化 final int len = s.length(); if (len == 0) return 0; int[] dp = new int[len + 1]; dp[0] = 1; if (s.charAt(0) != '0') dp[1] = 1; else dp[1] = 0; // 2.一维DP方程 for (int i = 2; i <= len; i++) { if (s.charAt(i - 1) != '0') dp[i] = dp[i - 1]; else dp[i] = 0; if (s.charAt(i - 2) == '1' || (s.charAt(i - 2) == '2' && s.charAt(i - 1) <= '6')) dp[i] += dp[i - 2]; } return dp[len]; }
4 总结
写递归的解法5 参考
leetcodeLeetCode:Decode Ways
相关文章推荐
- java软件工程师面试准备
- 理想的程序员
- 架构师最怕程序员知道的10件事
- 黑马程序员——流程控制和函数详解
- 2015年阿里巴巴蚂蚁金服校招JAVA研发工程师内推电话面试
- leetcode面试准备:Multiply Strings
- 黑马程序员 异常( 格式 体现 总结 ) 包
- 黑马程序员--内部类
- 面试题3:替换空格和清除空格
- 面试题2:二维数组中的查找
- 未来五年程序员应当具备的十项技能
- 黑马程序员——OC基础---面向对象(思想,类,对象,三大特性)
- 程序员的最大噩梦是什么?
- <<程序员的自我修养>>第一章读书读书笔记----从hello world说起
- leetoj Longest Substring Without Repeating Characters
- 2015年中Android面试
- 求职杂章
- 面试时如何向公司提问?
- 今天我想结束菜鸟的生活
- 面试技巧之群面