您的位置:首页 > 其它

leetcode笔记—Decode Ways

2016-06-14 20:21 260 查看
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) {
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;

}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: