|
@@ -0,0 +1,46 @@
|
|
|
+const MOD int = 1000000007
|
|
|
+
|
|
|
+func numDecodings(s string) int {
|
|
|
+ n := len(s)
|
|
|
+ if n == 0 {
|
|
|
+ return 1
|
|
|
+ }
|
|
|
+ dp := make([]int, n+1)
|
|
|
+ dp[0] = 1
|
|
|
+ switch s[0] {
|
|
|
+ case '*':
|
|
|
+ dp[1] = 9
|
|
|
+ case '0':
|
|
|
+ return 0
|
|
|
+ default:
|
|
|
+ dp[1] = 1
|
|
|
+ }
|
|
|
+ for i := 2; i <= n; i++ {
|
|
|
+ if s[i-1] == '*' {
|
|
|
+ dp[i] = 9 * dp[i-1] // blabla | *
|
|
|
+ if s[i-2] == '1' || s[i-2] == '*' {
|
|
|
+ dp[i] += 9 * dp[i-2] // blabla | 1*
|
|
|
+ }
|
|
|
+ if s[i-2] == '2' || s[i-2] == '*' {
|
|
|
+ dp[i] += 6 * dp[i-2] // blabla | 2*
|
|
|
+ }
|
|
|
+ } else if s[i-1] != '0' {
|
|
|
+ dp[i] = dp[i-1]
|
|
|
+ if s[i-2] == '1' || s[i-2] == '*' {
|
|
|
+ dp[i] += dp[i-2] // blabla | 17
|
|
|
+ }
|
|
|
+ if s[i-1] < '7' && (s[i-2] == '2' || s[i-2] == '*') {
|
|
|
+ dp[i] += dp[i-2] // blabla | 26
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if s[i-2] == '1' || s[i-2] == '*' {
|
|
|
+ dp[i] += dp[i-2] // blabla | 10
|
|
|
+ }
|
|
|
+ if s[i-2] == '2' || s[i-2] == '*' {
|
|
|
+ dp[i] += dp[i-2] // blabla | 20
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dp[i] %= MOD
|
|
|
+ }
|
|
|
+ return dp[n]
|
|
|
+}
|