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.
idea:
Dynamic Programming
ways[i] means the ways for decoding from ith character to the end of the string, then we could have formula as below:
ways[i] =0 when s[i] = '0'
ways[i+1] when s[i] and s[i+1] could not combinate to a valid decoding
ways[i+1] + ways[i+2] otherwise
int NumDecodings(string s)
{
int len = s.length();
if (len == 0) return 0;
int ways[len+1];
//this value is set for easy calculation for last two numbers
ways[len] = 1;
//the ways decoding for last number
ways[len-1] = s[len-1] == '0'? 0 : 1;
for (int i = len-2; i >= 0; --i)
{
char c0 = s[i];
if(c0 == '0')
{
ways[i] = 0;
continue;
}
//decode current number only
ways[i] = ways[i+1];
//decode with next number to be two
char c1 = s[i+1];
//valid two numbers decoding
if (c0 == '1'
|| (c0 == '2' && c1 <= '6'))
ways[i] += ways[i+2];
}
return ways[0];
}
想过用其他办法处理,不是太复杂,就是漏了情况……