leetcode 91. Decode Ways
一、问题描述
一条由A-Z字母组成的消息使用以下映射编码成数字:'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,确定解码方法的总数。
【举例】
<例 1>
输入: "12"
输出: 2
解释: "AB" (1 2) or "L" (12).
<例 2>
输入: "226"
输出: 3
解释: "BZ" (2 26), "VF" (22 6), or "BBF" (2 2 6).
二、解题思路
dp[i]为长度为i的子串的总的编码方式则初始状态 dp[0]=0 ; dp[1]=1
状态转移方程为:
dp[i] =
{
dp[i-1]+dp[i-2] i>2&&( s[i-2]=='1'||s[i-2]=='2'&&s[i-1]<='6' )
dp[i-1]+1 i==2
}
- dp[i]=dp[i-1] 状态表示单个数字有效可编码时,长度为i的子串编码方式数继承长度为i-1的编码方式数
- dp[i]=dp[i-1]+dp[i-2] 状态表示两个数字有效可编码时,长度为i的子串编码方式数为长度为i-1编码方式数与长度为i-2编码方式数之和
三、算法实现
/************************************************ Author:tmw date:2018-5-27 *************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> int numDecodings(char* s) { int i; int dp[strlen(s)+1]; for(i=0; i<=strlen(s); i++) dp[i] = 0; dp[0]=0; dp[1]=1; if(s[0]=='0') return 0; for(i=2;i<=strlen(s);i++) { //单个数字有效的情况 if( s[i-1] != '0' ) dp[i] = dp[i-1]; //两个数字有效的情况 if( s[i-2]=='1'||s[i-2]=='2'&&s[i-1]<='6' ) { if(i==2) dp[i] += 1; else dp[i] += dp[i-2]; } } return dp[strlen(s)]; }
四、执行结果
accept
梦想还是要有的,万一实现了呢~~~ヾ(◍°∇°◍)ノ゙~~~~