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[1[+dp[i-2];若不是0,除了与前一个字符组合外,还可以自己编码,即dp[i]=dp[i]+dp[i-1].
 

代码:

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];
    }

}

猜你喜欢

转载自blog.csdn.net/chenxy132/article/details/84960002