pub fn longest_repeated_substring(sv: &str) -> String {
let chars: Vec<char> = sv.chars().collect();
let n = chars.len();
let ndim = n + 1; let mut lcsre = vec![0usize; 2 * ndim];
let mut res_length = 0; let mut index = 0;
for i in 1..ndim {
let cur_row = (i % 2) * ndim;
let prev_row = ((i - 1) % 2) * ndim;
for j in i + 1..ndim {
if chars[i - 1] == chars[j - 1] && lcsre[prev_row + j - 1] < (j - i) {
lcsre[cur_row + j] = lcsre[prev_row + j - 1] + 1;
if lcsre[cur_row + j] > res_length {
res_length = lcsre[cur_row + j];
index = i;
}
} else {
lcsre[cur_row + j] = 0;
}
}
}
if res_length > 0 {
sv[index - res_length..index].to_string()
} else {
String::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_lcsre() {
let cstr = "+-00+-00+-00+-0";
let res = longest_repeated_substring(cstr);
assert_eq!(res, "+-00+-0");
let cstr = "abcdefgh";
let res = longest_repeated_substring(cstr);
assert_eq!(res, "");
let cstr = "banana";
let res = longest_repeated_substring(cstr);
assert_eq!(res, "an");
let cstr = "";
let res = longest_repeated_substring(cstr);
assert_eq!(res, "");
let cstr = "aaaaa";
let res = longest_repeated_substring(cstr);
assert_eq!(res, "aa");
let cstr = "ababa";
let res = longest_repeated_substring(cstr);
assert_eq!(res, "ab");
}
}