题解 | 「力扣」第 639 题:解码办法 II(困难)
摘要:这道题其实和「力扣」第 90 题(解码办法 I)是相同的,就是多了通配符 *
使得分类议论变得复杂起来。
我把重要的部分作为注释通配符选择器写在这儿,今后有空再来补偿。
参看代码:
public class Solut通配符查找io通配符是什么意思n {
private int M = 1000000007;
public int numDecodings(S通配符是什么意思tring s)通配符查找 {
int len = s.length();
long[] dp = new long[len + 1];
dp[0] = 1;
char[] charArray = s.toCharArray();
if (charArray[0] == '0') {
return 0;
}
if (charAr通配符选择器ray[0] == '*') {通配符掩码
dp[1] = 9;
} else {
d通配符*是表明它所在位置上的什么p[1] = 1;
}
for (int i = 2; i <= len; i++) {
char pre = charArray[i - 2];
char cur = charArray[通配符*是表明它所在位置上的什么i - 1];
// 状况 1:cur 独自通配符掩码编码,不考虑之前
if (cur == '*') {
dp[i] += 9 * dp[i - 1];
} else if (cur > '0') {
dp[i] += dp[i - 1];
}
// 状况 2:考虑 pre 能够和 cur 吞并在一通配符*是表明它所在位置上的什么起编码的状况通配符是什么意思
if (pre == '*') {
if (cu通配符查找r == '*') {
// 两个通配符 ** 能够有 15 种状况
dp[i] += 15 * dp[i - 2];
} else if (cur <= '6') {
// *0、*1、*2、*3、*4、*5、*6 能够拼成
// 10、1通配符井号的含义1、12、13、14、15、16
// 20、21、22、23、24、25、26 所以这儿系数是 2
dp[i] += 2 * dp[i - 2];
} els通配符选择器用什么符号表明e {
// *7 *8 *9 只能拼凑成 1 种状况,就是 17、18、19
dp[i] += dp[i - 2];
}
} else if (pre == '1' || pre == '2') {
if (cur == '*') {
// 1*、2* 的时分
// 特别注意:10 和 20 的状况上面现已议论过了,所以不可通配符选择器用什么符号表明以重复通配符是什么意思加上去
if (pre == '1') {
// 1* 能够拼成 11、12、13、14、15、16、17、18、19
dp[i] += 9 * dp[i - 2];
} else {通配符是什么意思
// 2* 能够拼成 21、22、23、24、25、26
dp[i] += 6 * dp[i - 2];
}
} else if (((pre - '0'通配符选择器) * 10 + (cur - '0'通配符*是表明它所在位置上的什么)) <= 26) {
// 当 pre 和 cur 并非通配符,且两个字符能够拼成一个的状况
dp[i] += dp[i - 2];
}
}
dp[i] %= M;
}
return (int) dp[len];
}
}