Browse Source

feat: decode_ways

Zhang Li 1 year ago
parent
commit
13a97e5d48
2 changed files with 85 additions and 1 deletions
  1. 83 0
      src/solutions/dp/decode_ways.rs
  2. 2 1
      src/solutions/dp/mod.rs

+ 83 - 0
src/solutions/dp/decode_ways.rs

@@ -0,0 +1,83 @@
+struct Solution;
+
+impl Solution {
+    pub fn num_decodings(s: String) -> i32 {
+        let n = s.len();
+
+        let mut dp = vec![vec![1;n];n];
+        let cv: Vec<i32> = s.chars().map(|x| x.to_digit(10).unwrap() as i32).collect();
+        for i in 0..n {
+            if cv[i] == 0 {
+                dp[i][i] = 0;
+            }
+        }
+        for k in 1..n {
+            let mut i = 0;
+            let mut j = k;
+            while i < n && j < n {
+                if i + 1 == j {
+                    if cv[i] > 0 && cv[i] <= 2 && cv[i+1] == 0 {
+                        dp[i][j] = 1;
+                    } else if cv[i] == 0 || cv[i+1] == 0 {
+                        dp[i][j] = 0;
+                    } else  {
+                        if 10* cv[i] + cv[i+1] <= 26 {
+                            dp[i][j] = 2;
+                        } else {
+                            dp[i][j] = 1;
+
+                        }
+                    }
+                } else {
+                    if cv[i] > 0 && cv[i] <= 2 && cv[i+1] == 0 {
+                        dp[i][j] = dp[i+2][j];
+                    } else if cv[i] == 0 || cv[i+1] == 0 {
+                        dp[i][j] = 0;
+                    }  else {
+                        if 10* cv[i] + cv[i+1] <= 26 {
+                            dp[i][j] = dp[i+1][j] + dp[i+2][j];
+                        } else {
+                            dp[i][j] = dp[i+1][j];
+                        }
+                    }
+                }
+                i += 1;
+                j += 1;
+
+            }
+
+        }
+        // println!("dp: {:?}", dp);
+
+        dp[0][n-1]
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_num_decodings() {
+        let s = String::from("226");
+        let res = Solution::num_decodings(s);
+        assert_eq!(res, 3);
+
+    }
+
+    #[test]
+    fn test_num_decodings2() {
+        let s = String::from("230");
+        let res = Solution::num_decodings(s);
+        assert_eq!(res, 0);
+
+    }
+
+    #[test]
+    fn test_num_decodings3() {
+        let s = String::from("00");
+        let res = Solution::num_decodings(s);
+        assert_eq!(res, 0);
+
+    }
+}

+ 2 - 1
src/solutions/dp/mod.rs

@@ -8,4 +8,5 @@ mod unique_paths;
 mod unique_paths_2;
 mod edit_distance;
 mod climbing_stairs;
-mod edit_distance2;
+mod edit_distance2;
+mod decode_ways;