[leetcode] 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.

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];
}

想過用其他辦法處理,不是太複雜,就是漏了情況……


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章