91

血红的双手。 提交于 2019-11-30 13:30:23
/*
这个问题可以分解成很多的子问题,比如以某数字开头的序列一共有多少种解码方法。这种分治的问题可以使用递归的方法。
由于在递归的过程中,有很多是重复的计算,所以可以使用动态规划的方法将计算过的中间结果保存起来,以加快计算。
*/

class Solution {
    public int numDecodings(String s) {
        int len = s.length();
        int[] dp = new int[len + 1];
        dp[len] = 1;
        if(s.charAt(len - 1) == '0'){
            dp[len - 1] = 0;
        }
        else{
            dp[len - 1] = 1;
        }
        for(int i = len - 2; i >= 0; i--){
            if(s.charAt(i) == '0'){
                dp[i] = 0;
                continue;
            }
            if((s.charAt(i) - '0') * 10 + (s.charAt(i+1) - '0') <= 26){
                dp[i] = dp[i+1] + dp[i+2];    
            }
            else{
                dp[i] = dp[i+1];
            }
        }
        return dp[0];
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!