dsalgo 0.3.10

A package for Datastructures and Algorithms.
Documentation
pub fn longest_common_substring<T: Eq>(
    a: &[T],
    b: &[T],
) -> Vec<Vec<usize>> {
    let n = a.len();

    let m = b.len();

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

    for i in 0..n {
        for j in 0..m {
            if a[i] == b[j] {
                dp[i + 1][j + 1] = dp[i][j] + 1;
            }
        }
    }

    dp
}

#[cfg(test)]

mod tests {

    use super::*;

    #[test]

    fn test() {
        let cases = vec![
            ("xy", vec![vec![0, 0, 0], vec![0, 1, 0], vec![0, 0, 2]]),
            (
                "ababa",
                vec![
                    vec![0, 0, 0, 0, 0, 0],
                    vec![0, 1, 0, 1, 0, 1],
                    vec![0, 0, 2, 0, 2, 0],
                    vec![0, 1, 0, 3, 0, 3],
                    vec![0, 0, 2, 0, 4, 0],
                    vec![0, 1, 0, 3, 0, 5],
                ],
            ),
            (
                "strangeorange",
                vec![
                    vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                    vec![0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                    vec![0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                    vec![0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
                    vec![0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 2, 0, 0, 0],
                    vec![0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 3, 0, 0],
                    vec![0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 4, 0],
                    vec![0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 5],
                    vec![0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0],
                    vec![0, 0, 0, 1, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0],
                    vec![0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 10, 0, 0, 0],
                    vec![0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 11, 0, 0],
                    vec![0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 12, 0],
                    vec![0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 13],
                ],
            ),
        ];

        for (s, ans) in cases {
            let s = s.as_bytes();

            let dp = longest_common_substring(s, s);

            assert_eq!(dp, ans);
        }
    }
}