zoukankan      html  css  js  c++  java
  • LeetCode Decode Ways

      有点意思的题目。用动态规划能够O(n)求解出来:a[i]代表子字符串string(0,i)的可能解码方式,a[i] = {a[i-1] or a[i-1]+a[i-2]}.

      意思是假设string(i)不为0,至少a[i] == a[i-1],即一种解码方法是string{0,.....(i-1)}+string(i); 

      然后假设string{i-1,i}是合法的(注意合法概念。比方11,12,20。但04就不合法)。那么a[i] = a[i-1]+a[i-2],即另一种解码方法是string{0,.....(i-2)}+string{i-1,i}

      另外值得注意是假设a[i]求出来为0,那就能够停止执行了,直接返回0,由于这个字符串没法被解码。


    #include<iostream>
    using namespace std;
    
    
    class Solution {
    public:
    	int numDecodings(string s) {
    		if (s == "")
    			return 0;
    		if (s.at(0) == '0')
    			return 0;
    		int len = s.size();
    		int* a = new int[len];
    
    		a[0] = 1;
    		for (int i = 1; i < len; i++)
    		{
    			a[i] = 0;
    
    			if (s.at(i) != '0')
    				a[i] = a[i - 1];
    			
    			if (s.at(i - 1) != '0')
    			{
    				int val = (s.at(i - 1) - '0') * 10 + (s.at(i) - '0');
    				if (val <= 26 && val > 0)
    				{
    					if (i >= 2)
    						a[i] += a[i - 2];
    					else
    						a[i] += 1;
    				}
    			}
    
    			if (a[i] == 0)
    				return 0;
    		}
    
    		return a[len-1];
    	}
    };
    
    int main()
    {
    	Solution sol;
    	string s = "12004";
    
    	cout << sol.numDecodings(s) << endl;
    }


  • 相关阅读:
    jzoj5377 开拓
    JZOJ5371 组合数问题
    JZOJ 10043 第k小数
    联赛emacs配置
    11.7 NOIP总复习总结
    cogs791 [HAOI2012] 音量调节
    bzoj1968 [Ahoi2005]COMMON 约数研究
    cogs 1330 [HNOI2008]玩具装箱toy
    cogs2479 偏序 cdq+树套树
    【CJOJ2433】陌上花开 CDQ分治
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7268876.html
Copyright © 2011-2022 走看看