639. 解码方法 II

Problem: 639. 解码方法 II

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

我们定义 d p [ i ] dp[i] dp[i]为从第 i i i个字符到最后一个字符的解码方法数量。对于每一个字符,我们有两种选择:单独解码,或者和下一个字符一起解码(如果和下一个字符一起解码是合法的)。

解题方法

状态转移方程为: d p [ i ] = d p [ i + 1 ] ∗ ( s [ i ] = = ′ ′ ? 9 : 1 ) + d p [ i + 2 ] ∗ ( a d d i t i o n a l c a s e s ) dp[i] = dp[i + 1] * (s[i] == '' ? 9 : 1) + dp[i + 2] * (additional cases) dp[i]=dp[i+1](s[i]==′′?9:1)+dp[i+2](additionalcases),其中 d p [ i + 1 ] ∗ ( s [ i ] = = ′ ′ ? 9 : 1 ) dp[i + 1] * (s[i] == '' ? 9 : 1) dp[i+1](s[i]==′′?9:1)表示单独解码第i个字符, d p [ i + 2 ] ∗ ( a d d i t i o n a l c a s e s ) dp[i + 2] * (additional cases) dp[i+2](additionalcases)表示将第i个字符和第 i + 1 i+1 i+1个字符一起解码。需要注意的是,如果第 i i i个字符是 ′ 0 ′ '0' 0,那么它不能单独解码,只能和前一个字符一起解码;如果第i个字符和第 i + 1 i+1 i+1个字符组成的数字大于26,那么它们不能一起解码。

复杂度

时间复杂度:

时间复杂度是 O ( n ) O(n) O(n),因为我们需要遍历整个字符串。

空间复杂度:

空间复杂度也是 O ( n ) O(n) O(n),因为我们需要一个长度为n的dp数组来存储中间结果。

Code

class Solution {
    public long mod = 1000000007;

    public int numDecodings(String str) {
        char[] s = str.toCharArray();
        int n = s.length;
        long[] dp = new long[n + 1];
        dp[n] = 1;
        for (int i = n - 1; i >= 0; i--) {
            if (s[i] != '0') {
                dp[i] = dp[i + 1] * (s[i] == '*' ? 9 : 1);
                if (i + 1 < n) {
                    if (s[i] != '*') {
                        if (s[i + 1] != '*') {
                            if ((s[i] - '0') * 10 + s[i + 1] - '0' <= 26) {
                                dp[i] += dp[i + 2];
                            }
                        } else {
                            if (s[i] == '1') {
                                dp[i] += dp[i + 2] * 9;
                            }
                            if (s[i] == '2') {
                                dp[i] += dp[i + 2] * 6;
                            }

                        }
                    } else {
                        // s[i] == '*'
                        if (s[i + 1] != '*') {
                            if (s[i + 1] <= '6') {
                                dp[i] += dp[i + 2] * 2;
                            } else {
                                dp[i] += dp[i + 2];
                            }

                        } else {
                            dp[i] += dp[i + 2] * 15;
                        }
                    }
                }
                dp[i] %= mod;
            }

        }
        return (int) dp[0];
    }
}

你可能感兴趣的:(刷题,算法,动态规划,leetcode)