【算法 & 动态规划 & 斐波那契数列模型】解码方法

解码方法

题目链接

解题思路: 动态规划

  1. 状态表示: dp[i] 表示前 i 个字符, 可以解码方法的总数

  2. 状态转移方程

    • 以 i 位置为结尾的字符, 可以有两种情况进行解码
      1. 单独解码
        • 如果该字符不为 0, 就可以解码成功, 就相当于 在区间 [0, i-1] 上, 在添上一个字符, 所以此时的 dp[i] = dp[i - 1]
        • 如果该字符为0, 就说明单独解码失败
      2. 与前一个字符一起解码
        • 如果两个字符的整数值 在[10,26] 之间, 就表示解码成功,那么此时 [0, i] 区间上的解码⽅法应该等于 [0, i - 2 ] 区间上的解码⽅法。此时 dp[i] = dp[i - 2] ;
        • 否则就是解码失败了

dp 的默认值就是 0, 上述两种情况在成立的情况下, 直接 += 即可;

  1. 初始化

    多创建一个辅助结点来帮助初始化

dp[0] = 1 保证后续的填表是正确的; 如果第一个字符不是 0, 则 dp[1] = 1

  1. 填表顺序: 从左往右填写

  2. 返回值: dp[n]

代码

class Solution {
    public int numDecodings(String s) {
        // 状态表示: dp[i] 表示前 i 个字符, 可以解码方法的总数
        int n = s.length();
        // 1. 创建dp表
        int[] dp = new int[n + 1];
        // 2. 初始化

        if(s.charAt(0) != '0') {
            dp[1] = 1;
        }

        // 保证填表的正确性
        dp[0] = 1;

        // 3. 填表
        for(int i = 2; i <= n; ++i) {
            if(s.charAt(i - 1) != '0') {
                dp[i] += dp[i - 1];
            }

            int tt = (s.charAt(i - 2) - '0') * 10 + s.charAt(i - 1) - '0';
            if(tt >= 10 && tt <= 26) {
                dp[i] += dp[i - 2];
            }
        }
        // 返回值
        return dp[n];
    }
}

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