题意
一条包含字母 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]; }