91. 解码方法

题意

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

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

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

91. 解码方法

 

 

 

提示

  • 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];
    }

 

上一篇:Linux基础之虚拟机创建、网卡激活、切换YUM源及用户级别等相关内容-91


下一篇:Python