Decode Ways II
class Solution {
// 1*3
// 1(*)3 (1*)3 1(*3)
//
public int numDecodings(String s) {
if (s == null || s.length() == 0 || s.charAt(0) == '0') {
return 0;
}
int len = s.length();
long mod = (long)1e9 + 7;
long[] dp = new long[len + 1];
dp[0] = 1;
dp[1] = s.charAt(0) == '*' ? 9 : 1;
// [1, 9, 9 + 2]
for (int i = 1; i < len; i++) {
char first = s.charAt(i - 1);
char second = s.charAt(i);
// As one digit value
if (second == '*') { // *
dp[i + 1] += dp[i] * 9;
} else if (second != '0') { // 1 - 9
dp[i + 1] += dp[i];
}
// As two digit values
if (first == '*') {
if (second == '*') { // **
dp[i + 1] += dp[i - 1] * 15;
} else if (second <= '6') { // *6
dp[i + 1] += 2 * dp[i - 1];
} else { // * can only be one
dp[i + 1] += dp[i - 1];
}
} else if (second == '*' && first == '1'){ // 1*
dp[i + 1] += dp[i - 1] * 9;
} else if (second == '*' && first == '2') { // 2*
dp[i + 1] += dp[i - 1] * 6;
} else if (first == '1' || (first == '2' && second <= '6')) { // no star, 10 ~ 26
dp[i + 1] += dp[i - 1];
}
dp[i + 1] %= mod;
}
return (int)dp[len];
}
}
最后更新于
这有帮助吗?