91. 解码方法

动态规划

class Solution {
    public int numDecodings(String s) {

        if (s.charAt(0) == '0'){
            return 0;
        }

        int n = s.length();

        /**
         * 定义dp[i]为长度为i的子串解码的总数,字符串为空默认也是一种解法,初始值dp[0] = 1,数组从1开始
         * 分以下两种情况:
         * 1、i单独解码,条件是s.charAt(i) != '0',此时dp[i] = dp[i - 1]
         * 2、i和i - 1一起解码,条件是i >= 2且这个两位数大于等于10小于等于26,此时dp[i] = dp[i - 2]
         */
        int[] dp = new int[n + 1];
        dp[0] = 1;

        for (int i = 1; i <= n; i++) {

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

            if (i >= 2 && s.charAt(i - 2) != '0' && ((s.charAt(i - 2) - '0') * 10 + (s.charAt(i - 1) - '0') <= 26)){
                dp[i] += dp[i - 2];
            }
        }

        return dp[n];
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(n)
 */

https://leetcode-cn.com/problems/decode-ways/

posted @ 2022-01-21 16:11  振袖秋枫问红叶  阅读(108)  评论(0)    收藏  举报