From 265a03da1262da1f6da5981116491d31b33b3c16 Mon Sep 17 00:00:00 2001 From: EFanZh Date: Wed, 3 Jan 2024 20:22:42 +0800 Subject: [PATCH] Add problem 1750: Minimum Length of String After Deleting Similar Ends --- src/lib.rs | 1 + .../iterative.rs | 64 +++++++++++++++++++ .../mod.rs | 24 +++++++ 3 files changed, 89 insertions(+) create mode 100644 src/problem_1750_minimum_length_of_string_after_deleting_similar_ends/iterative.rs create mode 100644 src/problem_1750_minimum_length_of_string_after_deleting_similar_ends/mod.rs diff --git a/src/lib.rs b/src/lib.rs index 335d36c7..44e2e544 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1304,6 +1304,7 @@ pub mod problem_1743_restore_the_array_from_adjacent_pairs; pub mod problem_1745_palindrome_partitioning_iv; pub mod problem_1748_sum_of_unique_elements; pub mod problem_1749_maximum_absolute_sum_of_any_subarray; +pub mod problem_1750_minimum_length_of_string_after_deleting_similar_ends; pub mod problem_1752_check_if_array_is_sorted_and_rotated; pub mod problem_1753_maximum_score_from_removing_stones; pub mod problem_1758_minimum_changes_to_make_alternating_binary_string; diff --git a/src/problem_1750_minimum_length_of_string_after_deleting_similar_ends/iterative.rs b/src/problem_1750_minimum_length_of_string_after_deleting_similar_ends/iterative.rs new file mode 100644 index 00000000..09f4a508 --- /dev/null +++ b/src/problem_1750_minimum_length_of_string_after_deleting_similar_ends/iterative.rs @@ -0,0 +1,64 @@ +pub struct Solution; + +// ------------------------------------------------------ snip ------------------------------------------------------ // + +impl Solution { + pub fn minimum_length(s: String) -> i32 { + let mut iter = s.as_bytes().iter(); + let mut first = iter.next().copied().unwrap(); + + if let Some(mut last) = iter.next_back().copied() { + loop { + if first == last { + // Consume left side that has the same value as `first`. + + loop { + if let Some(&left) = iter.next() { + if left != first { + first = left; + + break; + } + } else { + return 0; + } + } + + // Consume right side that has the same value as `last`. + + loop { + if let Some(&right) = iter.next_back() { + if right != last { + last = right; + + break; + } + } else { + return 1; + } + } + } else { + return iter.len() as i32 + 2; + } + } + } else { + 1 + } + } +} + +// ------------------------------------------------------ snip ------------------------------------------------------ // + +impl super::Solution for Solution { + fn minimum_length(s: String) -> i32 { + Self::minimum_length(s) + } +} + +#[cfg(test)] +mod tests { + #[test] + fn test_solution() { + super::super::tests::run::(); + } +} diff --git a/src/problem_1750_minimum_length_of_string_after_deleting_similar_ends/mod.rs b/src/problem_1750_minimum_length_of_string_after_deleting_similar_ends/mod.rs new file mode 100644 index 00000000..5f22f8d6 --- /dev/null +++ b/src/problem_1750_minimum_length_of_string_after_deleting_similar_ends/mod.rs @@ -0,0 +1,24 @@ +pub mod iterative; + +pub trait Solution { + fn minimum_length(s: String) -> i32; +} + +#[cfg(test)] +mod tests { + use super::Solution; + + pub fn run() { + let test_cases = [ + ("ca", 2), + ("cabaabac", 0), + ("aabccabba", 3), + ("bbbbbbbbbbbbbbbbbbbbbbbbbbbabbbbbbbbbbbbbbbccbcbcbccbbabbb", 1), + ("c", 1), + ]; + + for (s, expected) in test_cases { + assert_eq!(S::minimum_length(s.to_string()), expected); + } + } +}