12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- const MOD int = 1000000007
- func numDecodings(s string) int {
- n := len(s)
- 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]
- }
|