1234567891011121314151617181920212223242526272829303132333435 |
- class Solution {
- private final int MOD = 1000000007;
- public int numDecodings(String s) {
- char[] chs = s.toCharArray(); // '*' means 1~9
- if (chs[0] == '0') return 0;
- int[] dp = new int[chs.length + 1];
- dp[0] = 1;
- dp[1] = chs[0] == '*' ? 9 : 1;
- for (int i = 2; i <= chs.length; i++) {
- char curr = chs[i - 1], prev = chs[i - 2];
- long val = 0;
- if (curr == '*') { // Warning: overflow!
- val = 9L * dp[i - 1]; // blabla | *
- if (prev == '1' || prev == '*')
- val += 9L * dp[i - 2]; // blabla | 1*
- if (prev == '2' || prev == '*')
- val += 6L * dp[i - 2]; // blabla | 2*
- } else if (curr == '0') {
- if (prev == '1' || prev == '*')
- val += dp[i - 2]; // blabla | 10
- if (prev == '2' || prev == '*')
- val += dp[i - 2]; // blabla | 20
- } else {
- val = dp[i - 1]; // blabla | curr
- if (prev == '1' || prev == '*')
- val += dp[i - 2]; // blabla | 1curr
- if ((prev == '2' || prev == '*') && curr <= '6')
- val += dp[i - 2]; // blabla | 2curr
- }
- dp[i] = (int) (val % MOD);
- }
- return dp[chs.length];
- }
- }
|