邓心一 пре 6 година
родитељ
комит
5c7d3f7f16
2 измењених фајлова са 35 додато и 3 уклоњено
  1. 0 3
      hard/639.decode-ways-ii.go
  2. 35 0
      hard/639.decode-ways-ii.java

+ 0 - 3
hard/639.decode-ways-ii.go

@@ -2,9 +2,6 @@ const MOD int = 1000000007
 
 
 func numDecodings(s string) int {
 func numDecodings(s string) int {
 	n := len(s)
 	n := len(s)
-	if n == 0 {
-		return 1
-	}
 	dp := make([]int, n+1)
 	dp := make([]int, n+1)
 	dp[0] = 1
 	dp[0] = 1
 	switch s[0] {
 	switch s[0] {

+ 35 - 0
hard/639.decode-ways-ii.java

@@ -0,0 +1,35 @@
+class Solution {
+    private final int MOD = 1000000007;
+
+    public int numDecodings(String s) {
+        char[] chs = s.toCharArray(); // '*' means 1~9
+        if (chs[0] == '0') return 0;
+        int[] dp = new int[chs.length + 1];
+        dp[0] = 1;
+        dp[1] = chs[0] == '*' ? 9 : 1;
+        for (int i = 2; i <= chs.length; i++) {
+            char curr = chs[i - 1], prev = chs[i - 2];
+            long val = 0;
+            if (curr == '*') { // Warning: overflow!
+                val = 9L * dp[i - 1]; // blabla | *
+                if (prev == '1' || prev == '*')
+                    val += 9L * dp[i - 2]; // blabla | 1*
+                if (prev == '2' || prev == '*')
+                    val += 6L * dp[i - 2]; // blabla | 2*
+            } else if (curr == '0') {
+                if (prev == '1' || prev == '*')
+                    val += dp[i - 2]; // blabla | 10
+                if (prev == '2' || prev == '*')
+                    val += dp[i - 2]; // blabla | 20
+            } else {
+                val = dp[i - 1]; // blabla | curr
+                if (prev == '1' || prev == '*')
+                    val += dp[i - 2]; // blabla | 1curr
+                if ((prev == '2' || prev == '*') && curr <= '6')
+                    val += dp[i - 2]; // blabla | 2curr
+            }
+            dp[i] = (int) (val % MOD);
+        }
+        return dp[chs.length];
+    }
+}