diff --git a/11_dynamic_programming/rust/Cargo.lock b/11_dynamic_programming/rust/Cargo.lock new file mode 100644 index 0000000..1cf5268 --- /dev/null +++ b/11_dynamic_programming/rust/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "longest_common" +version = "0.1.0" diff --git a/11_dynamic_programming/rust/Cargo.toml b/11_dynamic_programming/rust/Cargo.toml new file mode 100644 index 0000000..91aa97f --- /dev/null +++ b/11_dynamic_programming/rust/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "longest_common" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/11_dynamic_programming/rust/src/main.rs b/11_dynamic_programming/rust/src/main.rs new file mode 100644 index 0000000..dffbe91 --- /dev/null +++ b/11_dynamic_programming/rust/src/main.rs @@ -0,0 +1,65 @@ +use std::cmp; + +fn build_dp_table(table1: &[T], table2: &[T]) -> Vec> { + let mut dp_table = vec![]; + for i in 0..table1.len() { + dp_table.push(vec![]); + for _ in 0..table2.len() { + dp_table[i].push(0); + } + } + + dp_table +} + +fn longest_common_substring(table1: &[T], table2: &[T]) -> Vec> { + let mut dp_table = build_dp_table(table1, table2); + + for (i, c1) in table1.into_iter().enumerate() { + for (j, c2) in table2.into_iter().enumerate() { + if c1 == c2 { + dp_table[i][j] = + dp_table[i.checked_sub(1).unwrap_or(0)][j.checked_sub(1).unwrap_or(0)] + 1; + } else { + dp_table[i][j] = 0; + } + } + } + + dp_table +} + +fn longest_common_subsequence(table1: &[T], table2: &[T]) -> Vec> { + let mut dp_table = build_dp_table(table1, table2); + + for (i, c1) in table1.into_iter().enumerate() { + for (j, c2) in table2.into_iter().enumerate() { + if c1 == c2 { + dp_table[i][j] = + dp_table[i.checked_sub(1).unwrap_or(0)][j.checked_sub(1).unwrap_or(0)] + 1; + } else { + dp_table[i][j] = cmp::max( + dp_table[i.checked_sub(1).unwrap_or(0)][j], + dp_table[i][j.checked_sub(1).unwrap_or(0)], + ); + } + } + } + + dp_table +} + +fn main() { + let dp_table_blue = ['b', 'l', 'u', 'e']; + let dp_table_clues = ['c', 'l', 'u', 'e', 's']; + + println!("Longest substring:"); + for line in longest_common_substring(&dp_table_blue, &dp_table_clues) { + println!("{:?}", line) + } + + println!("Longest subsequence:"); + for line in longest_common_subsequence(&dp_table_blue, &dp_table_clues) { + println!("{:?}", line) + } +}