欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

91. 解码方法

程序员文章站 2022-07-16 09:50:48
...

这算是昨天做的题了,总结一下,醍醐灌顶,对于动态规划问题,在前几天博客中我已经进行了总结,发现我掌握的只是个别题的做法,没有领悟精髓,今天再一看,真的感触很多,我们对待动态规划问题,想一想每一步的各种情况,也就是每个子问题的各种情况,与上一个子问题的联系等等!一定要找好状态转换方程!下面列出题目:

91. 解码方法

我们发现,所有的问题都在怎么去找子问题上,这种题目一般都是后面的字符与前面的字符有啥联系呢,下面我们看这个题,我们写在纸上会发现有两种模式,226  我们发现如果22可以形成二种(2,2和22)那么我们需要找第一个2之前的状态,也就是说dp[i+1]=dp[i]+dp[i-1],怎么来的就不说啦,就是提醒自己,一定要找转换方程,把每一步好好想一想。下面列出代码:

    public int numDecodings(String s) {
        if(s.length()==0||s.equals("")) return  0;
        int[] dp=new int[s.length()+1];
        if(s.charAt(0)=='0') return 0;
        dp[0]=1;
        dp[1]=1;
        for(int i=2;i<dp.length;i++){
            if(s.charAt(i-1)=='0'&&(s.charAt(i-2)!='1'&&s.charAt(i-2)!='2')) return 0;
            if(s.charAt(i-2)=='1'||(s.charAt(i-2)=='2'&&s.charAt(i-1)-'0'<=6)){
                if(s.charAt(i-1)=='0'){
                    dp[i]=dp[i-2];
                    continue;
                }
                dp[i]=dp[i-1]+dp[i-2];
            }
            else {
                dp[i]=dp[i-1];
            }
            System.out.println(dp[i]+"  ");
        }
        return dp[dp.length-1];
    }

边界记得处理一下就行了

相关标签: leetcode