Leetcode 91 解码方法

Posted 牛有肉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode 91 解码方法相关的知识,希望对你有一定的参考价值。

 

  这道题怎么说呢,真的很卧槽。分分钟想把出题人打一顿,题目根本没说明白,字符串中会包含 \'0\' 。状态转移五分钟,边界处理两小时。

  DP 解法:

    public final int numDecodings(String s) {
        if (s == null || s.length() == 0 || s.charAt(0) == \'0\') {
            return 0;
        }
        int[] dp = new int[s.length() + 1];
        //虚拟边界
        dp[0] = 1;
        dp[1] = 1;
        for (int i = 2; i < s.length() + 1; i++) {
            if (s.charAt(i - 1) == \'0\') {
                // 0 无法解码
                char pre = s.charAt(i - 2);
                if ((pre == \'0\') || ((pre != \'1\') && (pre != \'2\'))) {
                    return 0;
                }
                // 0 解码
                dp[i] = dp[i - 2];
                continue;
            }
            dp[i] = dp[i - 1];
            if (s.charAt(i - 2) != \'0\' && Integer.valueOf(s.substring(i - 2, i)) < 27) {
                if (i - 2 >= 0) {
                    dp[i] += dp[i - 2];
                }
            }
        }
        return dp[s.length()];
    }

  状态转移过程中,dp[i] 只与 dp[i-1] 和 dp[i-2] 有关。因此不必建立缓存数组,只缓存前两个结果即可。优化下空间复杂度:

public final int numDecodings0(String s) {
        if (s == null || s.length() == 0 || s.charAt(0) == \'0\') {
            return 0;
        }
        //虚拟边界
        int pre1 = 1;
        int pre2 = 1;
        for (int i = 2; i < s.length() + 1; i++) {
            int current = 0;
            char preChar = s.charAt(i - 2);
            if (s.charAt(i - 1) == \'0\') {
                // 0 无法解码
                if ((preChar == \'0\') || ((preChar != \'1\') && (preChar != \'2\'))) {
                    return 0;
                }
                // 0 解码
                current = pre2;
                pre1 = current;
                continue;
            }
            current = pre1;
            if (preChar != \'0\' && Integer.valueOf(s.substring(i - 2, i)) < 27) {
                current += pre2;
            }
            pre2 = pre1;
            pre1 = current;
        }
        return pre1;
    }

 

以上是关于Leetcode 91 解码方法的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 91. 解码方法c++/java详细题解

LeetCode#91-解码方法

LeetCode 91 动态规划 Decode Ways 解码方法

leetcode 91. 解码方法

leetcode 91. 解码方法

leetcode-91-解码方法