639.decode-ways-ii.go 882 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. const MOD int = 1000000007
  2. func numDecodings(s string) int {
  3. n := len(s)
  4. dp := make([]int, n+1)
  5. dp[0] = 1
  6. switch s[0] {
  7. case '*':
  8. dp[1] = 9
  9. case '0':
  10. return 0
  11. default:
  12. dp[1] = 1
  13. }
  14. for i := 2; i <= n; i++ {
  15. if s[i-1] == '*' {
  16. dp[i] = 9 * dp[i-1] // blabla | *
  17. if s[i-2] == '1' || s[i-2] == '*' {
  18. dp[i] += 9 * dp[i-2] // blabla | 1*
  19. }
  20. if s[i-2] == '2' || s[i-2] == '*' {
  21. dp[i] += 6 * dp[i-2] // blabla | 2*
  22. }
  23. } else if s[i-1] != '0' {
  24. dp[i] = dp[i-1]
  25. if s[i-2] == '1' || s[i-2] == '*' {
  26. dp[i] += dp[i-2] // blabla | 17
  27. }
  28. if s[i-1] < '7' && (s[i-2] == '2' || s[i-2] == '*') {
  29. dp[i] += dp[i-2] // blabla | 26
  30. }
  31. } else {
  32. if s[i-2] == '1' || s[i-2] == '*' {
  33. dp[i] += dp[i-2] // blabla | 10
  34. }
  35. if s[i-2] == '2' || s[i-2] == '*' {
  36. dp[i] += dp[i-2] // blabla | 20
  37. }
  38. }
  39. dp[i] %= MOD
  40. }
  41. return dp[n]
  42. }