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[n] != '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;
}
};