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) {
int length = s.size();
if(0 == length)
return 0;
vector<int> result(length);
for(int i = 0; i < result.size(); ++i)
result[i] = -1;
return nums(s, 0, result);
}
int nums(const string& s, int cur, vector<int>& result)
{
if(cur >= s.size())
return 1;
if(result[cur] >= 0)
return result[cur];
if('0' == s.at(cur))
{
result[cur] = 0;
return 0;
}
if(cur < s.size() - 1)
{
int val = (s.at(cur) - '0')*10 + s.at(cur+1) - '0';
if(val >= 10 && val <= 26)
{
result[cur] = nums(s, cur + 1, result) + nums(s, cur + 2, result);
return result[cur];
}
}
result[cur] = nums(s, cur + 1, result);
return result[cur];
}
};
自底向上的,迭代的方法。两种方法都是用了20ms,可见递归+备忘录的方法并没有太大的劣势。
函数调用的开销并不像想象的那么大。
class Solution {
public:
int numDecodings(string s) {
int length = s.size();
if(0 == length)
return 0;
vector<int> result(length + 1);
for(int i = 0; i < result.size(); ++i)
result[i] = 0;
result[length] = 1;
result[length - 1] = s.at(s.size() - 1) == '0'? 0: 1;
for(int i = length - 2; i >= 0; --i)
{
if('0' == s[i])
{
result[i] = 0;
continue;
}
else
{
int val = (s[i] - '0')*10 + s[i+1] - '0';
if(val >= 10 && val <= 26)
{
result[i] = result[i+1] + result[i+2];
continue;
}
}
result[i] = result[i+1];
}
return result[0];
}
};