• Decode Ways -- LeetCode


    原题链接: http://oj.leetcode.com/problems/decode-ways/ 
    这道题要求解一个数字串依照字符串编码方式可解析方式的数量。看到这样的求数量的,我们非常easy想到动态规划来存储前面信息,然后迭代得到最后结果。
    我们维护的量res[i]是表示前i个数字有多少种解析的方式,接下来来想想递归式,有两种方式:第一种新加进来的数字不然就是自己比較表示一个字符,那么解析的方式有res[i-1]种,另外一种就是新加进来的数字和前一个数字凑成一个字符,解析的方式有res[i-2]种(由于上一个字符和自己凑成了一个)。当然这里要推断前面说的两种情况是否能凑成一个字符,也就是范围的推断,假设能够才有相应的解析方式,假设不行,那么就是0。终于结果就是把这两种情况相应的解析方式相加。这里能够把范围分成几个区间:
    (1)00:res[i]=0(无法解析,没有可行解析方式);
    (2)10, 20:res[i]=res[i-2](仅仅有另外一种情况成立);
    (3)11-19, 21-26:res[i]=res[i-1]+res[i-2](两种情况都可行);
    (4)01-09, 27-99:res[i]=res[i-1](仅仅有第一种情况可行);
    递推式就是依照上面的规则来得到,接下来我们仅仅要进行一遍扫描,然后依次得到维护量就能够了,算法的时间复杂度是O(n)。空间上能够看出我们每次仅仅须要前两位的历史信息,所以仅仅须要维护三个变量然后迭代赋值就能够了,所以空间复杂度是O(1)。代码例如以下:
    public int numDecodings(String s) {
        if(s==null || s.length()==0 || s.charAt(0)=='0')
        {
            return 0;
        }
        int num1=1;
        int num2=1;
        int num3=1;
        for(int i=1;i<s.length();i++)
        {
            if(s.charAt(i)=='0')
            {
                if(s.charAt(i-1)=='1' || s.charAt(i-1)=='2')
                    num3 = num1;
                else
                    return 0;
            }
            else
            {
                if(s.charAt(i-1)=='0' || s.charAt(i-1)>='3')
                    num3 = num2;
                else
                {
                    if(s.charAt(i-1)=='2' && s.charAt(i)>='7' && s.charAt(i)<='9')
                        num3 = num2;
                    else
                        num3 = num1+num2;
                }
            }
            num1 = num2;
            num2 = num3;
        }
        return num2;
    }
    这道题是一维动态规划的题目,递推式关系来说是比較easy得到的,主要是要对这些两位数进行划分有一些细节,easy出小错误。
  • 相关阅读:
    获得H.264视频分辨率的方法
    学习Mathematica
    关于LaTeX公式排版
    关于Jordan标准形
    关于surface gradient
    Jacobi-Anger expansion
    两个1/x类的广义函数
    积分计算相关内容
    关于multi-index
    关于$mathcal{D}(0,1)$上的一个有趣结论
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3792434.html
Copyright © 2020-2023  润新知