Leetcode 91 decode-ways 动笔就简单

这道题倒是不难,但我就是很喜欢,我自己在编写的过程中很少喜欢等到真正动笔理清楚,再去写代码,但是这个让我见识到了,等一下的好处。

题目:

一条包含字母 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"));
	}

}

嘿嘿

猜你喜欢

转载自blog.csdn.net/ata_123/article/details/80778373
今日推荐