zoukankan      html  css  js  c++  java
  • 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
    ", 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];
    }
    
  • 相关阅读:
    需求的有序化和方案的系统化
    产品 增长 口碑传播
    私域流量的价值 大悦城微信营销:14万微信会员哪来的
    产品创新阶段关口细则
    业务关键数据指标
    TOB 增长
    医美品零售门店分析
    数据赋能饮品轻食
    [已读]你不知道的JavaScript(上卷)
    [已读]移动web手册
  • 原文地址:https://www.cnblogs.com/sakurapiggy/p/13066679.html
Copyright © 2011-2022 走看看