1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
pub fn lcs_len<T: Eq>(
    a: &[T],
    b: &[T],
) -> usize {
    let n = a.len();

    let m = b.len();

    if n < m {
        return lcs_len(b, a);
    }

    let mut dp = vec![0; m + 1];

    let mut mx = 0;

    for i in 0..n {
        for j in (0..m).rev() {
            dp[j + 1] = if a[i] == b[j] { dp[j] + 1 } else { 0 }
        }

        mx = mx.max(*dp.iter().max().unwrap());
    }

    mx
}

#[cfg(test)]

mod tests {

    use super::*;

    #[test]

    fn test() {
        let cases = vec![(("abcaba", "acaca"), 2)];

        for ((s, t), ans) in cases {
            assert_eq!(lcs_len(s.as_bytes(), t.as_bytes()), ans);
        }
    }
}