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