题目链接
思路:
对于单个字符来说,范围在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