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.
思路:这道题跟走台阶有点类似,可以用dp做。不考虑边界条件时,假设已经编码xxxxxxxx_ _了i-1个数字,现在待编码第i个字符,从题意推导可得:设置num=s[i-1]*10+s[i],如果num>=10&&num<=26,即s[i-1]s[i]可以编码成一个字符。用f[i]表示编码的方法数,i表示编码数字的下标,则f[i]+=f[i-2];如果s[i]!='0',则可以由i-1编码到i,则f[i]+=f[i-1]。
class Solution {
public:
int numDecodings(string s) {
int len = s.length(),i;
vector<int> f;
f.resize(len);
for(i=0; i<len; ++i)
{
f[i] = 0;
}
if (len == 0)
{
return 0;
}
if (s[0] != '0')
{
f[0] = 1;
}
if (len == 1)
{
return f[0];
}
int num = (s[0] - '0')*10 + (s[1] - '0');
if ((num > 10 && num < 20) || (num > 20 && num <= 26))
{
f[1] = 2;
}
if (num == 10 || num == 20 || (num > 26 && s[1] != '0'))
{
f[1] = 1;
}
if (len == 2)
{
return f[1];
}
for(i=2; i<len; ++i)
{
num = (s[i-1] - '0') * 10 + s[i] - '0';
if (num >= 10 && num <= 26)
{
f[i] += f[i-2];
}
if (s[i] != '0')
{
f[i] += f[i-1];
}
}
return f[len-1];
}
};