639.decode-ways-ii.go 909 B

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