小念子

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

题意

一条包含字母 A-Z 的消息通过以下方式进行了编码:

'A' -> 1
'B' -> 2
...
'Z' -> 26
给定一个只包含数字的非空字符串,请计算解码方法的总数。

题目数据保证答案肯定是一个 32 位的整数。

 

 

 

提示

  • 1 <= s.length <= 100
  • s 只包含数字,并且可以包含前导零。

解答

以位置i处开始的字符串解码方法总数,取决于以位置i+1和i+2处开始字符串解码方法总数,假设为dp[i]、dp[i + 1]、dp[i + 2]

  ①i与i+1处的字符串构成的整数大于26,dp[i] = dp[i + 1]

  ②i与i+1处的字符串构成的整数小于等于26,dp[i] = dp[i + 1] + dp[i + 2]

类似于有条件的走楼梯,且注意含0的处理,最终返回dp[0]

代码如下

    public int numDecodings(String s) {
        if (s == null || s.length() == 0) {
            return 0;
        }
        int[] dp = new int[s.length() + 1];
        dp[s.length()] = 1;
        char ch = s.charAt(s.length() - 1);
        if (ch == '0') {
            dp[s.length() - 1] = 0;
        } else {
            dp[s.length() - 1] = 1;
        }
        for (int i = s.length() -2; i >= 0; --i) {
            ch = s.charAt(i);
            if (ch == '0') {
                dp[i] = 0;
            } else {
                int value = (s.charAt(i) - '0') * 10 + (s.charAt(i + 1) - '0');
                if (value > 26) {
                    dp[i] = dp[i + 1];
                } else {
                    dp[i] = dp[i + 1] + dp[i + 2];
                }
            }
        }
        return dp[0];
    }

 

posted on 2020-11-05 20:56  小念子  阅读(95)  评论(0编辑  收藏  举报