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.
思路:
采用非递归方法解决,numOfDecodings[i]保存以第i个字符开头的字符串能够解码出来的种类。
如果s[i]='0',则numOfDecodings[i]=0,因为不能以0开头
如果s[i]='1',则numOfDecodings[i]=numOfDecodings[i+1]+numOfDecodings[i+2];
如果s[i]='2'并且,0<=s[i+1]<7,则numOfDecodings[i]=numOfDecodings[i+1]+numOfDecodings[i+2];
否则,numOfDecodings[i]=numOfDecodings[i+1];
代码:
int numDecodings(string
s) {
int len=s.length();
if(len<=0)
{
return 0;
}
int *numOfDecodings=new int[len];
for(int i=0; i<len; ++i)
{
numOfDecodings[i]=0;
}
if(s[len-1]>'0')
{
numOfDecodings[len-1]=1;
}
if(len>=2)
{
if(numOfDecodings[len-1]==0)
{
if(s[len-2]=='1' || s[len-2]=='2')
{
numOfDecodings[len-2]=1;
}
else
{
return 0;
}
}
else
{
if(s[len-2] == '1')
{
numOfDecodings[len-2]=2;
}
else if(s[len-2] == '2')
{
if(s[len-1]>'0' && s[len-1]<'7')
{
numOfDecodings[len-2]=2;
}
else
{
numOfDecodings[len-2]=1;
}
}
else if(s[len-2] == '0')
{
numOfDecodings[len-2]=0;
}
else
{
numOfDecodings[len-2]=1;
}
}
}
for(int i=len-3; i>=0; --i)
{
if((s[i]=='1') || (s[i]=='2' && (s[i+1]>='0' && s[i+1]<'7')))
{
numOfDecodings[i]=numOfDecodings[i+1]+numOfDecodings[i+2];
}
else if(s[i]=='0')
{
numOfDecodings[i]=0;
}
else
{
numOfDecodings[i]=numOfDecodings[i+1];
}
}
return numOfDecodings[0];
}