LeetCode-91-解码方法

LeetCode-91-解码方法

题目

一条包含字母 A-Z 的消息通过以下方式进行了编码:

'A' -> 1
'B' -> 2
...
'Z' -> 26

给定一个只包含数字的非空字符串,请计算解码方法的总数。

示例 1:

输入: "12"
输出: 2
解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。

示例 2:

输入: "226"
输出: 3
解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。

思路

这道题是以前完成的,具体的思路看了代码注释大概想了起来,设定的状态转移方程如下:

\[dp[i] = dp[i-1]+dp[i-2] \]

但是看我提交的代码这么多,看来边界的处理不是很方便呀,记录以免重复做题:

代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int numDecodings(char * s){
	int len = strlen(s);
	int dp[4000] = {0};
	int i = -1;
	
	if (len==0) return 0;
	if (len==1)
	{
		if ('0' == *s) return 0;
		return 1;
	}
	
	// 设置初始条件 
	if (s[0]!='0')
	{
		dp[0] = 1;
		dp[1] = 1;
	}
	
	// dp[n] = dp[n-1] + dp[n-2]
	for (i=2; i<len+1; i++)
	{
		int m = s[i-2] - 48, n = s[i-1] - 48;
		//printf ("%d %d\n", m, n);
		
		if (n==0 && m==0)
		{
			dp[i] = 0;
		}else if (n==0 && m != 0)
		{
			if (m*10+n <= 26)
			{
				dp[i] = dp[i-2];
			}else
			{
				dp[i] = 0;
			}
		}else if (n!=0 && m==0)
		{
			dp[i] = dp[i-1];
		}else
		{
			if (m*10+n <= 26)
			{
				dp[i] = dp[i-1] + dp[i-2];
			}else
			{
				dp[i] = dp[i-1];
			}
		}
		
		
		
	}
	return dp[len];
}
posted @ 2020-06-08 16:51  樱花小猪  阅读(109)  评论(0编辑  收藏  举报