Skip to content

Commit f491068

Browse files
authored
add dynamic programming examples in rust (#296)
1 parent 25b308f commit f491068

File tree

3 files changed

+78
-0
lines changed

3 files changed

+78
-0
lines changed

11_dynamic_programming/rust/Cargo.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[package]
2+
name = "longest_common"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
use std::cmp;
2+
3+
fn build_dp_table<T>(table1: &[T], table2: &[T]) -> Vec<Vec<u64>> {
4+
let mut dp_table = vec![];
5+
for i in 0..table1.len() {
6+
dp_table.push(vec![]);
7+
for _ in 0..table2.len() {
8+
dp_table[i].push(0);
9+
}
10+
}
11+
12+
dp_table
13+
}
14+
15+
fn longest_common_substring<T: Eq>(table1: &[T], table2: &[T]) -> Vec<Vec<u64>> {
16+
let mut dp_table = build_dp_table(table1, table2);
17+
18+
for (i, c1) in table1.into_iter().enumerate() {
19+
for (j, c2) in table2.into_iter().enumerate() {
20+
if c1 == c2 {
21+
dp_table[i][j] =
22+
dp_table[i.checked_sub(1).unwrap_or(0)][j.checked_sub(1).unwrap_or(0)] + 1;
23+
} else {
24+
dp_table[i][j] = 0;
25+
}
26+
}
27+
}
28+
29+
dp_table
30+
}
31+
32+
fn longest_common_subsequence<T: Eq>(table1: &[T], table2: &[T]) -> Vec<Vec<u64>> {
33+
let mut dp_table = build_dp_table(table1, table2);
34+
35+
for (i, c1) in table1.into_iter().enumerate() {
36+
for (j, c2) in table2.into_iter().enumerate() {
37+
if c1 == c2 {
38+
dp_table[i][j] =
39+
dp_table[i.checked_sub(1).unwrap_or(0)][j.checked_sub(1).unwrap_or(0)] + 1;
40+
} else {
41+
dp_table[i][j] = cmp::max(
42+
dp_table[i.checked_sub(1).unwrap_or(0)][j],
43+
dp_table[i][j.checked_sub(1).unwrap_or(0)],
44+
);
45+
}
46+
}
47+
}
48+
49+
dp_table
50+
}
51+
52+
fn main() {
53+
let dp_table_blue = ['b', 'l', 'u', 'e'];
54+
let dp_table_clues = ['c', 'l', 'u', 'e', 's'];
55+
56+
println!("Longest substring:");
57+
for line in longest_common_substring(&dp_table_blue, &dp_table_clues) {
58+
println!("{:?}", line)
59+
}
60+
61+
println!("Longest subsequence:");
62+
for line in longest_common_subsequence(&dp_table_blue, &dp_table_clues) {
63+
println!("{:?}", line)
64+
}
65+
}

0 commit comments

Comments
 (0)