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 numDecodingsInt(char * s)
{
if (s == NULL)
return 0;
int strSize = strlen(s);
if (s[0] == '0')
return 0;
if (strSize == 1)
{
return 1;
}
if (strSize == 2)
{
if (s[1] == '0')
{
if (s[0] >= '3') //30 40 50
return 0;
else
return 1; //10 20
}
else if (s[0] == '1')
{
return 2;
}
else if (s[0] == '2' && s[1] <= '6')
{
return 2;
}
else
{
return 1;
}
}
}
int numDecodings(string s) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if (s.empty())
return 0;
int strSize = s.size();
int num1 = numDecodingsInt(&s[strSize-1]);
if (strSize == 1)
return num1;
int num2 = numDecodingsInt(&s[strSize-2]);
if (strSize == 2)
return num2;
int curNum = 0;
for (int i = strSize-3; i >= 0; i--)
{
if (s[i] == '0')
{
curNum = 0;
}
else if (s[i] == '1')
{
if (s[i+1] == '0')
{
curNum = num1; //10
}
else
{
curNum = num1+num2; //11,12,13,....19
}
}
else if (s[i] == '2')
{
if (s[i+1] == '0')
{
curNum = num1; //20
}
else if (s[i+1] > '6' && s[i+1] <= '9') //27,28,29
{
curNum = num2;
}
else
{
curNum = num1+num2; //21,22,23,24,25,26
}
}
else
{
curNum = num2; //31,32....99
}
num1 = num2;
num2 = curNum;
}
return curNum;
}
};