Skip to content

Instantly share code, notes, and snippets.

@Pzixel
Created September 15, 2018 13:56
Show Gist options
  • Save Pzixel/ec81eafaabc74acf32ed53cb85c97bca to your computer and use it in GitHub Desktop.
Save Pzixel/ec81eafaabc74acf32ed53cb85c97bca to your computer and use it in GitHub Desktop.
fn are_concatable_strings(a: &str, b: &str, result: &str) -> bool {
if a.len() + b.len() != result.len() {
return false;
}
let a: Vec<_> = a.chars().collect();
let b: Vec<_> = b.chars().collect();
let result: Vec<_> = result.chars().collect();
let mut i = 0;
let mut j = 0;
let mut k = 0;
let mut match_len = 0;
while k < result.len() {
let ai = a.get(i);
let bj = b.get(j);
let ref rk = result[k];
if ai == Some(rk) && bj == Some(rk) {
match_len += 1;
i += 1;
j += 1;
k += 1;
} else if ai == Some(rk) {
i += 1;
j -= match_len;
match_len = 0;
k += 1;
} else if bj == Some(rk) {
j += 1;
i -= match_len;
match_len = 0;
k += 1;
} else if ai == None && bj == None || match_len != 0 {
j -= match_len;
match_len = 0;
} else {
return false;
}
}
true
}
#[cfg(test)]
mod tests {
use super::*;
macro_rules! generate_test {
($name:ident, $c:expr, $a:expr, $b:expr, $result:expr) => {
#[test]
fn $name() {
assert_eq!(are_concatable_strings($a, $b, $c), $result);
}
}
}
generate_test!(a, "javascript", "javpt", "ascri", true);
generate_test!(b, "javascript", "jasrit", "vacp", true);
generate_test!(c, "javascript", "java", "scripts", false);
generate_test!(d, "javascript", "jav", "script", false);
generate_test!(e, "java not script", "java ", "not script", true);
generate_test!(f, "javascript", "java ", "scritp", false);
generate_test!(g, "Java1Java3Java2Java4", "Java2Java4", "Java1Java3", true);
generate_test!(h, "jjaaamaaat", "jaaam", "jaaat", true);
generate_test!(m, "jjbaaamqtba", "jaaam", "jbqtba", true);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment