题目链接
解码方法
题目描述
注意点
- s 只包含数字,并且可能包含前导零
- 计算并返回 解码 方法的 总数
解答思路
- 使用动态规划解决本题,其思路为:从后往前遍历字符串,遍历到任一i位置的字符c时,有几种情况:
如果c的值为0,则此时该字符无法单独组成一个字母,也无法与后面的数字共同组成一个字母,此时dp[i] = 0;
如果c的值大于0,但与后面的字符组成的数字大于26,则其仅能单独组成一个字母,无法与后面的数字共同组成一个字母,此时dp[i] = dp[i + 1];
如果c的值大于0,且与后面的字符组成的数字不大于26,则其不仅能单独组成一个字母,还能与后面的数字共同组成一个字母,此时dp[i] = dp[i + 1] + dp[i + 2]
代码
class Solution {
public int numDecodings(String s) {
if (s.charAt(0) == '0') {
return 0;
}
int n = s.length();
int[] dp = new int[n + 1];
dp[n] = 1;
if (s.charAt(n - 1) != '0') {
dp[n - 1] = 1;
}
for (int i = n - 2; i >= 0; i--) {
if (s.charAt(i) == '0') {
dp[i] = 0;
} else {
// 单独切割为一个字母
dp[i] += dp[i + 1];
// 能与后面的数字共同组成一个字母
if (((s.charAt(i) - '0') * 10 + (s.charAt(i + 1) - '0')) <= 26) {
dp[i] += dp[i + 2];
}
}
}
return dp[0];
}
}
关键点
- 动态规划的思想