use crate::statistical_tests::utils::convert_string;
use std::collections::HashMap;
pub fn get_lr(text: &str) -> f64 {
let data = convert_string(text);
if data.len() < 2 {
return 0.0;
}
let mut longest_repeat = 0;
for length in (2..=data.len() / 2).rev() {
if has_repeat(&data, length) {
longest_repeat = length;
break;
}
}
longest_repeat as f64
}
fn has_repeat(data: &[usize], length: usize) -> bool {
let mut substrings = HashMap::new();
for i in 0..=(data.len() - length) {
let substring = &data[i..(i + length)];
let key = substring.to_vec();
if substrings.contains_key(&key) {
return true;
}
substrings.insert(key, i);
}
false
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_lr_with_repeats() {
let text = "ABCDEFABCDEF";
let lr = get_lr(text);
assert!(lr >= 6.0); }
#[test]
fn test_lr_without_repeats() {
let text = "ABCDEFGHIJKL";
let lr = get_lr(text);
assert_eq!(lr, 0.0); }
#[test]
fn test_lr_short_text() {
let text = "A";
let lr = get_lr(text);
assert_eq!(lr, 0.0);
}
}