pub fn naive_bwt(inputs: &[&str]) -> String {
let mut rotations: Vec<String> = vec![];
for s in inputs.iter() {
let dollar_string = s.to_string()+"$";
for l in 0..dollar_string.len() {
rotations.push(
dollar_string[l..].to_string()+
&dollar_string+
&dollar_string[..l]
);
}
}
rotations.sort();
let mut ret: String = String::with_capacity(rotations.len());
for r in rotations.iter() {
ret.push(r.as_bytes()[r.len()-1] as char);
}
ret
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_basic() {
let data: Vec<&str> = vec!["CCGT", "N", "ACG"];
let bwt_stream = naive_bwt(&data);
assert_eq!(bwt_stream, "GTN$$ACCC$G");
}
#[test]
fn test_diff_len() {
let data: Vec<&str> = vec!["A", "AA", "AAA"];
let bwt_stream = naive_bwt(&data);
assert_eq!(bwt_stream, "AAA$AA$A$");
}
#[test]
fn test_cycle_breaker() {
let data: Vec<&str> = vec!["ACA", "CA"];
let bwt_stream = naive_bwt(&data);
assert_eq!(bwt_stream, "AACC$A$");
}
}