LeetCode ---- 91、解码方法

题目链接

思路:

对于单个字符来说,范围在1~9之间,则这个字符可以单独进行解码

对于连续的两个字符来说,所组成的数字范围在10~26之间时,则这两个字符可以结合起来进行编码

以每一个字符为结尾,计算从开头到当前字符共有多少种不同的解码方法,最后一个字符计算完成之后,也就完成了对本题的计算

计算过程中,对于每一个字符,如果这个字符等于"0",则不可以进行单独解码,只能与前面的字符进行结合解码,否则可以单独进行解码

若此字符在1~6之前,且前一个字符为"2",则当前字符可以与前一个字符进行结合解码

若前一个字符为"1",则当前字符可以与前一个字符进行结合解码

否则都只能进行单独解码

 由此可以看出,以每一个字符结尾的解码方法的结果都依赖于前面字符

即:dp[i + 1] = dp[i]    s.charAt(i) == "0"

       dp[i + 1] = dp[i] + dp[ i - 1]    s.charAt(i - 1) == "1" || s.charAt(i - 1) == "2" && s.charAt(i) <= "6"

扫描二维码关注公众号,回复: 11527991 查看本文章
    public int numDecodings(String s) {
        if (s == null || s.length() == 0 || s.charAt(0) == '0') {
            return 0;
        }
        int len = s.length();
        // dp数组大小为len+1,每一个i位置结尾的结果放在dp中的i+1位置
        int[] dp = new int[len + 1];
        // 初始化dp[0] = 1
        dp[0] = 1;
        for (int i = 0; i < len; i++) {
            dp[i + 1] = s.charAt(i) == '0' ? 0 : dp[i]; // 若当前字符不为0,则可以单独解码
            if (i > 0 && (s.charAt(i - 1) == '1' || 
                            s.charAt(i - 1) == '2' && s.charAt(i) <= '6')) {
                 dp[i + 1] += dp[i - 1];  // 与前面字符结合解码
            }
        }
        return dp[len];
    }

代码参考自:https://leetcode-cn.com/problems/decode-ways/comments/15627

猜你喜欢

转载自blog.csdn.net/sinat_34679453/article/details/107266578