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) 。

思路:参考了网上大神的代码,原文链接如下:  https://blog.csdn.net/u012156116/article/details/79763005。

这个题是给出一组数字,判断共有多少种解码方案。整体上可以看做是动态规划。有些类似于上台阶有多少种解决方案。但这个题中有0和26的限制。以下代码的思路上先处理前两个字符。第一个字符如果是0的话解码方法就是0,;接着判断第二个字符,这部分只需判断第二个和第一个字符是否小于26.对于之后的各个字符,都有两种形式的解码方案,一是自己本身可以解码,另外是和前一个字符组合。如果字符本身为0,需要判断和前一个字符组合是否小于26,若满足,则dp[i]=dp[i]+dp[i-2];若不是0,除了与前一个字符组合外,还可以自己编码,即dp[i]=dp[i]+dp[i-1].(dp[i]表示第i位有多少解码方式)

 

这个是剑指46题。剑指中的思路采用从最小的子问题开始自下而上解决问题,这样可以消除重复的子问题。但是没有找到在leetcode中可以成功运行的相关代码。先把之前的代码看明白。以下两种代码都是上面那种思路。

我自己再一次写代码使用递归的思路写的,出现各种问题。。。。。

代码:

class Solution {
    public static int numDecodings(String s) {
        if(s.length()==0){
            return 0;
        }
        int[] dp = new int[s.length()];
        dp[0] = s.charAt(0)=='0'?0:1;
        if(s.length()==1){
            return dp[0];
        }
        int k = s.charAt(0) > '0' && s.charAt(1) > '0'? 1:0;
        dp[1] = k + (s.charAt(0) == '1' || s.charAt(0) == '2' && s.charAt(1) <= '6' ? 1:0);
        for (int i = 2; i < dp.length; i++) {
            if(s.charAt(i)!='0'){
                dp[i] += dp[i-1];
            }
            if(s.charAt(i-1)=='1'||s.charAt(i-1)=='2'&&s.charAt(i)<='6'){
                dp[i] += dp[i-2];
            }
        }
        return dp[s.length()-1];
    }

}

以下这个是leetcode中提交最多的代码:

这个和上面的代码是相同的思路,但是实现有些不同

class Solution {
    public int numDecodings(String s) {
        if(s==null||s.length()==0)
            return 0;
        int n=s.length();
        int[] dp=new int[n+1];
        dp[0]=1;
        dp[1]=s.charAt(0)=='0'?0:1;
        for(int i=2;i<=n;i++){
            if(s.charAt(i-1)!='0')
                dp[i]+=dp[i-1];
            if(s.charAt(i-2)=='1'||s.charAt(i-2)=='2'&&s.charAt(i-1)<='6')
                dp[i]+=dp[i-2];
        }
        return dp[n];
    }
}

 

你可能感兴趣的:(LeetCode笔记,剑指)