leetcode笔记—Decode Ways
2016-06-14 20:21
260 查看
A message containing letters from
mapping:
Given an encoded message containing digits, determine the total number of ways to decode it.
For example,
Given encoded message
2) or
The number of ways decoding
有几种实现方式。
动态规划解法:
class Solution {
public:
int numDecodings(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int len = s.size();
if(len ==0)
return 0;
int a = 1;//f(n-2)
int b = 0;//f(n-1)
// f(n) += f(n-1) s
!= '0';
// f(n) += f(n-2) s[n,n-1] eq "10"-"26";
if(s[len-1]!='0')
b = 1;
if(len==1)
return b;
int c ;
for(int i = 2; i <=len; i++)
{
string tmp = s[len-i]+s[len-i+1];
c = 0;
if(s[len-i]!='0')
c += b;
if(s[len-i]=='1' || s[len-i]=='2' && s[len-i+1] <= '6')
c += a;
a = b;
b = c;
}
return c;
}
};
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.
有几种实现方式。
class Solution { public: int numDecodings(string s) { vector<int> ways(s.size(), 0); if (s.size() == 0) return 0; if (s.size() == 1) return check(s[0]); ways[0] = check(s[0]); ways[1] = (check(s[0]) & check(s[1])) + check(s[0], s[1]);//一位数的实现+两位数的实现 for (size_t i = 2; i < s.size(); ++i) { if (check(s[i])) ways[i] += ways[i - 1];//如果高位不为0, if (check(s[i - 1], s[i])) ways[i] += ways[i - 2];//如果高两位可以是一种实现 } return ways[s.size() - 1]; } int check(char one) //一位数时,不为0,则有一种方式 { return (one != '0') ? 1 : 0; } int check(char one, char two) //两位数时,如果十位数为1或者,十位数为2且个位数小于6是,则为一种方式 { return (one == '1' || (one == '2' && two <= '6'))? 1 : 0; } };
动态规划解法:
class Solution {
public:
int numDecodings(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int len = s.size();
if(len ==0)
return 0;
int a = 1;//f(n-2)
int b = 0;//f(n-1)
// f(n) += f(n-1) s
!= '0';
// f(n) += f(n-2) s[n,n-1] eq "10"-"26";
if(s[len-1]!='0')
b = 1;
if(len==1)
return b;
int c ;
for(int i = 2; i <=len; i++)
{
string tmp = s[len-i]+s[len-i+1];
c = 0;
if(s[len-i]!='0')
c += b;
if(s[len-i]=='1' || s[len-i]=='2' && s[len-i+1] <= '6')
c += a;
a = b;
b = c;
}
return c;
}
};
相关文章推荐
- 学生信息管理系统
- 权限树问题
- 实战Walker之侧滑菜单的实现分析
- VBA Study Notes
- VBA Study Notes
- VBA Study Notes
- VBA Study Notes
- VBA Study Notes
- VBA Study Notes
- VBA Study Notes
- div嵌套后margin出现失效(转移)的问题
- TreeSet的Comparator排序
- <LeetCode OJ> 334. Increasing Triplet Subsequence
- app使用微信支付成功后,点击返回到该app却跳到另外一个app去了
- 344. Reverse String
- [Java] 静态方法与非静态方法的区别
- &与&&运算的区别?
- 第十三周项目二-动物这样叫
- Weex快速上手教程(Weex Tutorial)
- 触发器 触发器的引入