LeetCode91——解码方法

题目链接:https://leetcode-cn.com/problems/decode-ways/description/
这题,我花了好大的功夫才通过,中途踩了很多坑,从这个15顶25踩,代码通过率只有10%多,就能看出这个题,虽然是一个中等难度的题,但是并没有那么好做。
看到题目,感觉有点像爬楼梯的那个?想到用动态规划。 第一次写代码,没有考虑0的情况,出错,那么就考虑吧,如果出现在头,就返回0,出现的中间的话。。。。。不过我是从后往前递推的,这么递推,有很大的一点不好,就是如果碰到了'0',该怎么处理的问题,我就想的很复杂了,先把一开始的字符串中的0,和它前面的那个字符一起考虑,以两个字符为间隔,分成好多个字符串,再把每个字符串的划分结果乘起来不就行了。这样做就要写好多处理了。
但是,如果从前往后进行动态规划的话,就算碰到了0,也能一起处理了。整个结题过程就变得比较简单。前两个字符单独进行处理就好。
class Solution
{
	vector<int> memo;
public:
	int numDecodings( string s )
	{
		if( s == "0" || s[0] == '0' )
			return 0;
		memo.clear( );
		memo = vector<int>( s.size( ), 0 );
		for( int i = 0; i < s.size( ); i++ )
		{
			if( i == 0 )
				memo[0] = 1;
			else if( i == 1 )
			{
				if( s[i] == '0' )
				{
					if( s[i - 1] == '1' || s[i - 1] == '2' )
						memo[1] = 1;
					else
						return 0;
				}
				else if( s.substr( 0, 2 ) > "10" && s.substr( 0, 2 ) <= "26" )
					memo[1] = 2;
				else 
					memo[1] = 1;
			}
			else
			{
				if( s[i] == '0' )
				{
					if( s[i - 1] == '1' || s[i - 1] == '2' )
						memo[i] = memo[i - 2];
					else
						return 0;
				}
				else if( s[i - 1] == '1' || s[i - 1] == '2' && s[i] <= '6' )
					memo[i] = memo[i - 1] + memo[i - 2];
				else
					memo[i] = memo[i - 1];
			}					
		}
		return memo[s.size( ) - 1];
	}
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值