91:编码方法

问题描述

一条包含字母 A-Z 的消息通过以下方式进行了编码:

'A' -> 1
'B' -> 2
...
'Z' -> 26

给定一个只包含数字的非空字符串,请计算解码方法的总数。

示例

输入: "12"
输出: 2
解释: 它可以解码为 "AB"1 2)或者 "L"12)。
输入: "226"
输出: 3
解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6)

问题分析

这题其实一眼就能看出来得用动态规划。而我们看不出来状态转移方程怎么办? do not worry . 我们多写几项。

比如 1222
我们先看1。没说的,就是1种.
再看12. —》 1,2 是一种, 12是一种,所以是两种.
再看122. —> 1,2,2是一种,12,2是一种,1,22是一种,所以是3种。
再看1222----> 1,2,2,2是一种,1,2,22是一种。 1,22,2是一种,12,2,2是一种,12,22是一种,所以是5种。
所以我们得出结论,这尼玛不是斐波那契数列?
等一下? 如果是127 怎么说? 1,2,7是一种,12,7是一种,然后就没了。因为没有27这种解法。
所以说我们我们得到了目前的转移方程:
如果最后一位加上是可以组合成2位的,那么dp[i] = dp[i-1] + dp[i-2].
如果不能组合成2位,那么dp[i] = dp[i-1].
再等一下!我们似乎没有考虑到0。 如果一个序列中含有30,40,50…等,是肯定没有办法解码的。如果我们有连续的2个0,也是没有办法解码的,我们需要提前判断这个情况。
如果是10,20,怎么办? 我们发现10和20其实是可以当做一位来处理的,而且这"一位"不能跟前一位结合,所以问题转化成了不能组合成2位的情况。所以对于0我们应当这样处理: dp[i] = dp[i-2]。

所以我们可以写代码了。

AC代码:

class Solution{

    public int numDecodings(String s){
        if(s.length() == 0){
            return 0;
        }
        if(s.charAt(0)=='0'){
            return 0;
        }
        for(int i = 0; i < s.length()-1; i++){
            if((s.charAt(i) == '0' || s.charAt(i) > '2')&& s.charAt(i+1) == '0'){
                return 0;
            }
        }
        int[] dp = new int[s.length()];
        dp[0] = 1;
        for(int i = 1; i < s.length(); i++){
            if(i == 1){
                if(s.charAt(1) == '0'){
                    dp[1] = 1;
                }
                else{
                    if((s.charAt(0)-'0')*10 + s.charAt(1)-'0' <= 26){
                        dp[1] = 2;
                    }
                    else{
                        dp[1] = 1;
                    }
                }
            }
            else{
                if(s.charAt(i) == '0'){
                    dp[i] = dp[i-2];
                }
                else{
                    if(s.charAt(i-1) == '0'){
                        dp[i] = dp[i-1];
                    }
                    else{
                        if((s.charAt(i-1)-'0')*10+s.charAt(i)-'0' <= 26){
                            dp[i] = dp[i-1] + dp[i-2];
                        }
                        else{
                            dp[i] = dp[i-1];
                        }
                    }
                }
            }
        }
        System.out.println(Arrays.toString(dp));
        return dp[dp.length-1];
    }
}
发布了333 篇原创文章 · 获赞 22 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41687289/article/details/103807468