639.decode-ways-ii.java 1.3 KB

1234567891011121314151617181920212223242526272829303132333435
  1. class Solution {
  2. private final int MOD = 1000000007;
  3. public int numDecodings(String s) {
  4. char[] chs = s.toCharArray(); // '*' means 1~9
  5. if (chs[0] == '0') return 0;
  6. int[] dp = new int[chs.length + 1];
  7. dp[0] = 1;
  8. dp[1] = chs[0] == '*' ? 9 : 1;
  9. for (int i = 2; i <= chs.length; i++) {
  10. char curr = chs[i - 1], prev = chs[i - 2];
  11. long val = 0;
  12. if (curr == '*') { // Warning: overflow!
  13. val = 9L * dp[i - 1]; // blabla | *
  14. if (prev == '1' || prev == '*')
  15. val += 9L * dp[i - 2]; // blabla | 1*
  16. if (prev == '2' || prev == '*')
  17. val += 6L * dp[i - 2]; // blabla | 2*
  18. } else if (curr == '0') {
  19. if (prev == '1' || prev == '*')
  20. val += dp[i - 2]; // blabla | 10
  21. if (prev == '2' || prev == '*')
  22. val += dp[i - 2]; // blabla | 20
  23. } else {
  24. val = dp[i - 1]; // blabla | curr
  25. if (prev == '1' || prev == '*')
  26. val += dp[i - 2]; // blabla | 1curr
  27. if ((prev == '2' || prev == '*') && curr <= '6')
  28. val += dp[i - 2]; // blabla | 2curr
  29. }
  30. dp[i] = (int) (val % MOD);
  31. }
  32. return dp[chs.length];
  33. }
  34. }