|
@@ -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);
|
|
|
+
|
|
|
+ }
|
|
|
+}
|