LeetCode091——解码方法

版权声明:版权所有,转载请注明原网址链接。 https://blog.csdn.net/qq_41231926/article/details/83104130

我的LeetCode代码仓:https://github.com/617076674/LeetCode

原题链接:https://leetcode-cn.com/problems/decode-ways/description/

题目描述:

知识点:动态规划

思路:动态规划

注意对字符‘0’的特殊处理。

状态定义

f(x) -------- 字符串s中[0, x - 1]范围内的子字符串的解码总数

状态转移

如果字符串s的第一个字符为0,直接返回0。

(1)初值条件:

f(0) = 1。这个值的设定只是迭代计算的需要,并无实际意义。

f(1) = 1。

(2)状态转移方程:

a.如果s.charAt(x - 2)对应的字符小于等于2。

    a-1:如果s.charAt(x - 2)对应的字符等于2。

        a-1-1:如果s.charAt(x - 1)对应的字符小于等于6。

            a-1-1-1:如果s.charAt(x - 1)对应的字符不等于0,则f(x) = f(x - 1) + f(x - 2)。

            a-1-1-2:如果s.charAt(x - 1)对应的字符等于0,则f(x) = f(x - 2)。

        a-1-2:如果s.charAt(x - 1)对应的字符大于6,则f(x) = f(x - 1)。

    a-2:如果s.charAt(x - 2)对应的字符等于1。

        a-2-1:如果s.charAt(x - 1)对应的字符不等于0,则f(x) = f(x - 1) + f(x - 2)。

        a-2-2:如果s.charAt(x - 1)对应的字符等于0,则f(x) = f(x - 2)。

    a-3:如果s.charAt(x - 2)对应的字符等于0。

        a-3-1:如果s.charAt(x - 1)对应的字符不等于0,则f(x) = f(x - 1)。

        a-3-2:如果s.charAt(x - 1)对应的字符等于0,则f(x) = 0。

b.如果s.charAt(x - 2)对应的字符大于2。

    b-1:如果s.charAt(x - 1)对应的字符等于0,则f(x) = 0。

    b-2:如果s.charAt(x - 1)对应的字符不等于0,则f(x) = f(x - 1)。

时间复杂度和空间复杂度均是O(n),其中n为字符串s的长度。

JAVA代码:

class Solution {
    public int numDecodings(String s) {
        int[] counts = new int[s.length() + 1];

        counts[0] = 1;
        if (s.charAt(0) == '0') {
            return 0;
        }
        counts[1] = 1;
        for (int i = 2; i <= s.length(); i++) {
            if (s.charAt(i - 2) - '0' <= 2) {
                if (s.charAt(i - 2) == '2') {
                    if (s.charAt(i - 1) - '0' <= 6) {
                        if (s.charAt(i - 1) != '0') {
                            counts[i] = counts[i - 1] + counts[i - 2];
                        } else {
                            counts[i] = counts[i - 2];
                        }
                    } else {
                        counts[i] = counts[i - 1];
                    }
                } else if (s.charAt(i - 2) == '1') {
                    if (s.charAt(i - 1) != '0') {
                        counts[i] = counts[i - 1] + counts[i - 2];
                    } else {
                        counts[i] = counts[i - 2];
                    }
                } else {
                    if (s.charAt(i - 1) != '0') {
                        counts[i] = counts[i - 1];
                    } else {
                        counts[i] = 0;
                    }
                }
            } else {
                if (s.charAt(i - 1) == '0') {
                    counts[i] = 0;
                } else {
                    counts[i] = counts[i - 1];
                }
            }
        }
        return counts[s.length()];
    }
}

LeetCode解题报告:

猜你喜欢

转载自blog.csdn.net/qq_41231926/article/details/83104130