A message containing letters fromA-Zis being encoded to numbers using the following mapping:
‘A’ -> 1
‘B’ -> 2
…
‘Z’ -> 26
Given an encoded message containing , 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.empty())
return 0;
for(int i = 0;i<s.size();i++)//存在异常时 如100 001 12505等
{
if (s[i] == '0')
{
if(i==0 || s[i-1] == '0' || s[i-1] > '2' )
return 0;
}
}
vector<int> vec(s.size()+1, 0);
return fun(s, s.size());
}
int fun(string &s, int n)
{
if(n<=1)
return 1;
if (s[n-1] == '0')
return fun(s, n-2);
else
return ((s[n-2] == '1' ) || (s[n-2] == '2' && s[n-1] <= '6'))?fun(s, n-1) + fun(s, n-2):fun(s, n-1);
}
};
1 n == 1|| 0
f(n-2) S[n] == '0'
f(n) = f(n-2) + f(n-1) s[n-1] == '1' || s[n-1] == '2' && s[n] <= '6'
f(n-1) else
//递归 保存结果
class Solution {
public:
int numDecodings(string s)
{
if (s.empty())
return 0;
for(int i = 0;i<s.size();i++)//存在异常时 如100 001 12505等
{
if (s[i] == '0')
{
if(i==0 || s[i-1] == '0' || s[i-1] > '2' )
return 0;
}
}
vector<int> vec(s.size()+1, 0);
return fun(s, s.size(), vec);
}
int fun(string &s, int n, vector<int> &vec)
{
if(n<=1)
return 1;
if (vec[n] != 0)
return vec[n];
if (s[n-1] == '0')
vec[n] = fun(s, n-2,vec);
else
vec[n] = ((s[n-2] == '1' ) || (s[n-2] == '2' && s[n-1] <= '6'))?fun(s, n-1,vec) + fun(s, n-2,vec):fun(s, n-1,vec);
return vec[n] ;
}
};
//动态规划
class Solution {
public:
int numDecodings(string s)
{
if (s.empty())
return 0;
for(int i = 0;i<s.size();i++)//存在异常时 如100 001 12505等
if (s[i] == '0')
if(i==0 || s[i-1] == '0' || s[i-1] > '2' )
return 0;
vector<int> vec(s.size()+1, 0);
for (int i=0;i<=s.size();i++)
{
if(i<=1)
vec[i] = 1;
else if (s[i-1] == '0')
vec[i] = vec[i-2];
else
vec[i] = ((s[i-2] == '1' ) || (s[i-2] == '2' && s[i-1] <= '6'))?vec[i-1] + vec[i-2]:vec[i-1];
}
return vec[s.size()];
}
};
测试
#include"head.h"
class Solution {
public:
int numDecodings(string s)
{
if (s.empty())
return 0;
for(int i = 0;i<s.size();i++)//存在异常时 如100 001 12505等
{
if (s[i] == '0')
{
if(i==0 || s[i-1] == '0' || s[i-1] > '2' )
return 0;
}
}
vector<int> vec(s.size()+1, 0);
return fun(s, s.size());
}
int fun(string &s, int n)
{
if(n<=1)
return 1;
if (s[n-1] == '0')
return fun(s, n-2);
else
return ((s[n-2] == '1' ) || (s[n-2] == '2' && s[n-1] <= '6'))?fun(s, n-1) + fun(s, n-2):fun(s, n-1);
}
};
//递归 保存
class Solution1 {
public:
int numDecodings(string s)
{
if (s.empty())
return 0;
for(int i = 0;i<s.size();i++)//存在异常时 如100 001 12505等
{
if (s[i] == '0')
{
if(i==0 || s[i-1] == '0' || s[i-1] > '2' )
return 0;
}
}
vector<int> vec(s.size()+1, 0);
return fun(s, s.size(), vec);
}
int fun(string &s, int n, vector<int> &vec)
{
if(n<=1)
return 1;
if (vec[n] != 0)
return vec[n];
if (s[n-1] == '0')
vec[n] = fun(s, n-2,vec);
else
vec[n] = ((s[n-2] == '1' ) || (s[n-2] == '2' && s[n-1] <= '6'))?fun(s, n-1,vec) + fun(s, n-2,vec):fun(s, n-1,vec);
return vec[n] ;
}
};
class Solution2 {
public:
int numDecodings(string s)
{
if (s.empty())
return 0;
for(int i = 0;i<s.size();i++)//存在异常时 如100 001 12505等
if (s[i] == '0')
if(i==0 || s[i-1] == '0' || s[i-1] > '2' )
return 0;
vector<int> vec(s.size()+1, 0);
for (int i=0;i<=s.size();i++)
{
if(i<=1)
vec[i] = 1;
else if (s[i-1] == '0')
vec[i] = vec[i-2];
else
vec[i] = ((s[i-2] == '1' ) || (s[i-2] == '2' && s[i-1] <= '6'))?vec[i-1] + vec[i-2]:vec[i-1];
}
return vec[s.size()];
}
};
int main()
{
string str = "11";
Solution s;
cout<<"递归"<<s.numDecodings(str)<<endl;
Solution1 s1;
cout<<"递归保存结果"<<s1.numDecodings(str)<<endl;
Solution2 s2;
cout<<"动态规划结果"<<s2.numDecodings(str)<<endl;
}