leetcode: Decode Ways
来源:互联网 发布:r语言mac安装教程 编辑:程序博客网 时间:2024/06/05 09:32
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.
本来是简单的斐波那契,这一变就变成动态规划加字符串处理了!!
class Solution {public: int numDecodings(string s) { if( s.size() == 0 || s[0] == '0') return 0; if( s.size() == 1) return 1; const int N = s.size(); vector< int> dp( N, 0); dp[0] = 1; int val = (s[0] - '0') * 10 + ( s[1] - '0'); if( val < 1 || val > 26){ if( val % 10 == 0) return 0; dp[1] = 1; } else if( val % 10 == 0){ dp[1] = 1; } else dp[1] = 2; for( int i = 2; i < N; ++i){ val = (s[i-1] - '0') * 10 + ( s[i] - '0'); if( val < 1){//连续两个0,无法解码 return 0; } else if( val < 10 || val > 26){ if( val % 10 == 0)//出现30,40....无法解码 return 0; dp[i] = dp[i-1];// 27,28,01,02解码方法数不变 } else if( val % 10 == 0){ if( s[i-2] > '0' && s[i-2] < '3')//720, 310 dp[i] = --dp[i-1]; else//出现1010 dp[i] = dp[i-1]; } else{//正常情况 dp[i] = dp[i-2] + dp[i-1]; } } return dp[N-1]; }};
附上别人优雅的解法
class Solution {public: int numDecodings(const string &s) { if (s.empty() || s[0] == '0') return 0;int prev = 0;int cur = 1;// 长度为 n 的字符串,有 n+1 个阶梯for (size_t i = 1; i <= s.size(); ++i) { if (s[i-1] == '0') cur = 0; if (i < 2 || !(s[i - 2] == '1' || (s[i - 2] == '2' && s[i - 1] <= '6')))prev = 0; int tmp = cur; cur = prev + cur; prev = tmp;}return cur; }};
0 0
- Leetcode 91. Decode Ways&&639.Decode ways
- LeetCode: Decode Ways
- [LeetCode]Decode Ways
- LeetCode Decode Ways
- LeetCode : Decode Ways
- [Leetcode] Decode Ways *
- [leetcode] Decode Ways (!!)
- leetcode 17: Decode Ways
- Leetcode: Decode ways
- LeetCode Decode Ways
- [LeetCode]Decode Ways
- [leetcode] Decode Ways
- Leetcode: Decode Ways
- [LeetCode] Decode Ways
- [leetcode]Decode Ways
- LeetCode-Decode Ways
- [leetcode] Decode Ways
- [LeetCode] Decode Ways
- Android 圆角ImageView
- hdu2056 矩形重叠面积(水题)
- 线程间的通信
- 16、实例 文字阴影
- SQL Link Oracle
- leetcode: Decode Ways
- iOS-下载一张网络图片
- 计算几何叉乘二分+博弈
- 17、实例 背景相关
- 【数论】威尔逊定理
- Oracle体验之旅(一)
- Effective C++笔记(1)
- dom4J
- 18、实例 CSS3之分栏布局