91. 解码方法

Problem: 91. 解码方法

文章目录

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

思路

这个问题可以使用动态规划来解决。我们定义dp[i]为从第i个字符到最后一个字符的解码方法数量。对于每一个字符,我们有两种选择:单独解码,或者和下一个字符一起解码(如果和下一个字符一起解码是合法的)。

解题方法

状态转移方程为:dp[i] = f(s, i + 1, dp) + f(s, i + 2, dp),其中f(s, i + 1, dp)表示单独解码第i个字符,f(s, i + 2, dp)表示将第i个字符和第i+1个字符一起解码。需要注意的是,如果第i个字符是’0’,那么它不能单独解码,只能和前一个字符一起解码;如果第i个字符和第i+1个字符组成的数字大于26,那么它们不能一起解码。

复杂度

时间复杂度:

时间复杂度 O ( n ) O(n) O(n)

空间复杂度:

空间复杂度 O ( 1 ) O(1) O(1)

Code

class Solution {
    public int numDecodings(String str) {
        char[] s = str.toCharArray();
        int n = s.length;
        int next = 1;
        int nextNext = 0;
        for (int i = n - 1, cur; i >= 0; i--) {
            if (s[i] == '0') {
                cur = 0;
            } else {
               cur = next;
                if (i + 1 < s.length && (s[i] - '0') * 10 + s[i + 1] - '0' <= 26) {
                    cur += nextNext;
                }
            }
            nextNext = next;
            next = cur;
        }
        return next;
    }
}

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