这道题倒是不难,但我就是很喜欢,我自己在编写的过程中很少喜欢等到真正动笔理清楚,再去写代码,但是这个让我见识到了,等一下的好处。
题目:
一条包含字母 A-Z
的消息通过以下方式进行了编码:
'A' -> 1 'B' -> 2 ... 'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。
示例 1:
输入: "12" 输出: 2 解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。
首先这道题一般的人会忘记0,我就在这吃了一会亏,把0考虑到,在自己解题的过程就发现,(就是和前面的组合,还是不组合,但在组合的过程中0又是特殊的)分为两种情况:
对于carr[i]==0时:还有两种情况:能和Carr[i-1]组成一个数m,(0<m<27),那就变成m插到前面的组合中,【。。。。。;m】,那么一共有dp【i-2】种,不满足上种情况,即0单独,则需要返回0;
对于carr[i]!=0时:是两种情况的和:能和Carr[i-1]组成一个数m,(0<m<27),那就变成m插到前面的组合中,【。。。。。;m】,那么一共有dp【i-2】种,不满足上种情况,即它单独,则需要dp[i-1]种;
代码如下:
package test;
public class LC91Try1
{
public int numDecodings(String s)
{
int len = s.length();
if (len == 0)
{
return 0;
}
char[] carr = s.toCharArray();
int[] dp = new int[len];
if (carr[0] == '0')
{
return 0;
}
if (len == 1)
{
return 1;
}
dp[0] = 1;
dp[1] = 1;
if (carr[1] != '0')
{
if (carr[0] == '1' || (carr[0] == '2' && carr[1] < '7'))
{
dp[1] = 2;
}
}
else
{
if (carr[0] != '2' && carr[0] != '1')
{
return 0;
}
}
for (int i = 2; i < len; i++)
{
if (carr[i] == '0')
{
if (carr[i - 1] != '2' && carr[i - 1] != '1')
{
return 0;
}
if (carr[i - 1] == '2' || carr[i - 1] == '1')
{
dp[i] = dp[i - 2];
}
}
else
{
if (carr[i - 1] == '1' || (carr[i - 1] == '2' && carr[i] < '7'))
{
dp[i] = dp[i - 2] + dp[i - 1];
}
else
{
dp[i] = dp[i - 1];
}
}
}
return dp[len - 1];
}
public static void main(String[] args)
{
LC91Try1 t = new LC91Try1();
System.out.println(t.numDecodings("301"));
}
}
嘿嘿