Decode Ways
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) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int size =s.size();
if(size == 0)
return 0;
return helper(s, 0,size);
}
int helper(string &s, int start, int n)
{
if(start >n)//结束条件
return 0;
if(start ==n)//结束条件
return 1;
if(s[start] == '0')
return 0;
if(start ==n - 1 ||s[start] > = '3' ||(s[start] == '2' &&s[start + 1] > '6'))
return helper(s,start + 1,n);
else
{
return helper(s,start + 1,n) +helper(s,start + 2,n);
}
}
};
public :
int numDecodings(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int size =s.size();
if(size == 0)
return 0;
return helper(s, 0,size);
}
int helper(string &s, int start, int n)
{
if(start >n)//结束条件
return 0;
if(start ==n)//结束条件
return 1;
if(s[start] == '0')
return 0;
if(start ==n - 1 ||s[start] > = '3' ||(s[start] == '2' &&s[start + 1] > '6'))
return helper(s,start + 1,n);
else
{
return helper(s,start + 1,n) +helper(s,start + 2,n);
}
}
};
递归改写的dp 16ms过
class
Solution {
public :
int numDecodings(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int size =s.size();
if(size == 0)
return 0;
vector < int >dp(size + 2, 0);
dp[size] = 1; //作为结束的条件,只要能到达dp[size]的就是一个可行的解
for( int i =size - 1;i > = 0;i --)
{
if(s[i] == '0')
dp[i] = 0;
else
{
if(i ==size - 1 ||s[i] > = '3' ||(s[i] == '2' &&s[i + 1] > '6'))
{
dp[i] =dp[i + 1];
}
else
dp[i] =dp[i + 1] +dp[i + 2];
}
}
return dp[ 0];
}
};
public :
int numDecodings(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int size =s.size();
if(size == 0)
return 0;
vector < int >dp(size + 2, 0);
dp[size] = 1; //作为结束的条件,只要能到达dp[size]的就是一个可行的解
for( int i =size - 1;i > = 0;i --)
{
if(s[i] == '0')
dp[i] = 0;
else
{
if(i ==size - 1 ||s[i] > = '3' ||(s[i] == '2' &&s[i + 1] > '6'))
{
dp[i] =dp[i + 1];
}
else
dp[i] =dp[i + 1] +dp[i + 2];
}
}
return dp[ 0];
}
};