diff --git a/rust/string-compression/Cargo.toml b/rust/string-compression/Cargo.toml new file mode 100644 index 0000000..549ee09 --- /dev/null +++ b/rust/string-compression/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "string-compression" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/rust/string-compression/src/main.rs b/rust/string-compression/src/main.rs new file mode 100644 index 0000000..50cb2cc --- /dev/null +++ b/rust/string-compression/src/main.rs @@ -0,0 +1,6 @@ + +mod string_compression; + +fn main() { + println!("Hello, world!"); +} diff --git a/rust/string-compression/src/string_compression.rs b/rust/string-compression/src/string_compression.rs new file mode 100644 index 0000000..3f14185 --- /dev/null +++ b/rust/string-compression/src/string_compression.rs @@ -0,0 +1,90 @@ +//! # 443. String Compression + +use core::num; + +pub struct Solution; + +impl Solution { + pub fn compress(chars: &mut Vec) -> i32 { + let mut i: usize = 0; + while i < chars.len() { + let letter = chars[i]; + let mut count: usize = 0; + while i + count < chars.len() && chars[i + count] == letter { + count += 1; + } + if count > 1 { + let number: String = count.to_string(); + for (index, item) in number.chars().enumerate() { + chars[i + index + 1] = item; + } + for _ in 0..(count - number.len() - 1) { + chars.remove(i + number.len() + 1); + } + i += number.len(); + } + i += 1; + } + chars.len() as i32 + } +} + +#[cfg(test)] +mod tests { + + use super::*; + + #[test] + fn test_aa() { + let mut chars = vec!['a', 'a']; + let expected = vec!['a', '2']; + let size = Solution::compress(&mut chars); + assert_eq!(chars, expected); + assert_eq!(size, 2); + } + + #[test] + fn test_aaa() { + let mut chars = vec!['a', 'a', 'a']; + let expected = vec!['a', '3']; + let size = Solution::compress(&mut chars); + assert_eq!(chars, expected); + assert_eq!(size, 2); + } + + #[test] + fn test_abaa() { + let mut chars = vec!['a', 'b', 'a', 'a']; + let expected = vec!['a', 'b', 'a', '2']; + let size = Solution::compress(&mut chars); + assert_eq!(chars, expected); + assert_eq!(size, 4); + } + + #[test] + fn test_1() { + let mut chars = vec!['a', 'a', 'b', 'b', 'c', 'c', 'c']; + let expected = vec!['a', '2', 'b', '2', 'c', '3']; + let size = Solution::compress(&mut chars); + assert_eq!(chars, expected); + assert_eq!(size, 6); + } + + #[test] + fn test_2() { + let mut chars = vec!['a']; + let expected = vec!['a']; + let size = Solution::compress(&mut chars); + assert_eq!(chars, expected); + assert_eq!(size, 1); + } + + #[test] + fn test_3() { + let mut chars = vec!['a', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b']; + let expected = vec!['a', 'b', '1', '2']; + let size = Solution::compress(&mut chars); + assert_eq!(chars, expected); + assert_eq!(size, 4); + } +} \ No newline at end of file