2023-05-31 22:31:49 -04:00
|
|
|
use crate::lcs::diff;
|
2023-05-28 21:43:20 -04:00
|
|
|
|
|
|
|
mod matrix;
|
2023-05-31 22:31:49 -04:00
|
|
|
mod lcs;
|
2023-05-28 21:43:20 -04:00
|
|
|
|
2023-05-31 22:31:49 -04:00
|
|
|
fn main() {
|
2023-06-04 20:26:40 -04:00
|
|
|
let a = "abcd";
|
|
|
|
let b = "abce";
|
2023-05-28 21:43:20 -04:00
|
|
|
|
2023-06-04 20:26:40 -04:00
|
|
|
// diff(a, b);
|
|
|
|
lcs(a, b);
|
2023-05-27 11:27:49 -04:00
|
|
|
}
|
2023-05-31 22:31:49 -04:00
|
|
|
|
2023-06-04 20:26:40 -04:00
|
|
|
fn lcs(a: &str, b: &str) {
|
|
|
|
let n = a.len();
|
|
|
|
let m = b.len();
|
|
|
|
let max = (n + m) / 2;
|
|
|
|
let mut v = vec![0usize; max * 2];
|
|
|
|
|
|
|
|
for d in 0..max {
|
|
|
|
let mut k = 0usize;
|
|
|
|
while k <= d * 2 {
|
|
|
|
let mut x = if k == 0 || k != d * 2 && v[k - 1] < v[k + 1] {
|
|
|
|
v[k + 1]
|
|
|
|
} else {
|
|
|
|
v[k - 1] + 1
|
|
|
|
};
|
|
|
|
|
|
|
|
let mut y = if k < x {
|
|
|
|
x - k
|
|
|
|
} else {
|
|
|
|
0
|
|
|
|
};
|
|
|
|
|
|
|
|
while x < n && y < m {
|
|
|
|
let ac = a.chars().nth(x + 1).unwrap();
|
|
|
|
let bc = b.chars().nth(y + 1).unwrap();
|
|
|
|
|
|
|
|
if ac != bc {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
x = x + 1;
|
|
|
|
y = y + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
v[k] = x;
|
|
|
|
if x >= n && y >= m {
|
|
|
|
println!("Length of a SES is D ({d})");
|
|
|
|
dbg!(v);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
k += 2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
println!("Length of a SES is greater than MAX ({max})");
|
|
|
|
dbg!(v);
|
|
|
|
}
|