dsalgo 0.3.10

A package for Datastructures and Algorithms.
Documentation
pub fn number_of_subsequences<T: std::hash::Hash + Eq>(
    modulus: i64,
    a: &[T],
    min_step: usize,
) -> i64 {
    let n: usize = a.len();

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

    dp[0] = 1;

    let mut prev = std::collections::HashMap::new();

    for i in 0..n {
        dp[i + 1] = dp[i] + dp[i.max(min_step) - min_step];

        let j = prev.entry(&a[i]).or_insert(n);

        if *j != n {
            dp[i + 1] -= dp[(*j).max(min_step) - min_step];
        }

        dp[i + 1] %= modulus;

        *j = i;
    }

    (*dp.last().unwrap() + modulus) % modulus
}

#[cfg(test)]

mod tests {

    use super::*;

    #[test]

    fn test() {
        const MOD: i64 = 1_000_000_007;

        let cases = vec![
            (("abc", 1), 5),
            (("aa", 1), 2),
            (("acba", 1), 7),
            (("chokudai", 1), 55),
        ];

        for ((s, k), ans) in cases {
            assert_eq!(number_of_subsequences(MOD, s.as_bytes(), k), ans);
        }
    }
}