1
Fork 0

Solve longest-common-prefix.

This commit is contained in:
Bauke 2022-04-06 15:04:41 +02:00
parent c8390c584f
commit 3882005994
Signed by: Bauke
GPG Key ID: C1C0F29952BCF558
2 changed files with 72 additions and 0 deletions

View File

@ -1,3 +1,4 @@
pub mod longest_common_prefix;
pub mod palindrome_number;
pub mod reverse_integer;
pub mod two_sum;

View File

@ -0,0 +1,71 @@
pub fn longest_common_prefix(strings: Vec<String>) -> String {
// Sort the strings ascending by length.
let mut strings = strings.clone();
strings.sort_by(|a, b| a.len().cmp(&b.len()));
// Then grab the shortest string.
let shortest_string = match strings.first() {
Some(string) => string,
None => return String::new(),
};
// The shortest string must be the maximum possible prefix, so start with it.
let mut prefix = shortest_string.clone();
// Then loop over the shortest string's length and check if every string in
// the list starts with the prefix, and if they don't, pop the last character
// from the prefix.
for _ in 0..shortest_string.len() {
// If we find a prefix that all strings start with, we've found the longest
// common one.
if strings.iter().all(|string| string.starts_with(&prefix)) {
break;
} else {
prefix.pop();
}
}
// If by the end there is no longest common prefix, the prefix will be an
// empty string.
prefix
}
#[test]
fn test_longest_common_prefix() {
assert_eq!(
longest_common_prefix(vec![
"doggo".to_string(),
"doggie".to_string(),
"dog".to_string(),
]),
"dog"
);
assert_eq!(
longest_common_prefix(vec![
"flower".to_string(),
"flow".to_string(),
"flight".to_string(),
]),
"fl"
);
assert_eq!(
longest_common_prefix(vec![
"dog".to_string(),
"racecar".to_string(),
"car".to_string(),
]),
""
);
assert_eq!(
longest_common_prefix(vec![
"dog".to_string(),
"racecar".to_string(),
"car".to_string(),
"".to_string()
]),
""
);
}