diff --git a/Cargo.lock b/Cargo.lock index a252cd3..80aba77 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,6 +6,10 @@ version = 3 name = "contains-duplicate" version = "0.1.0" +[[package]] +name = "is_palindrome" +version = "0.1.0" + [[package]] name = "two_sum" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index f749b8a..dca366b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,10 +1,12 @@ [workspace.lints.clippy] -pedantic = "warn" -nursery = "warn" +nursery = { level = "warn", priority = -1 } +pedantic = { level = "warn", priority = -1 } +needless_pass_by_value = "allow" [workspace] members = [ "crates/contains_duplicate", + "crates/is_palindrome", "crates/two_sum", "crates/valid_anagram", ] diff --git a/crates/is_palindrome/Cargo.toml b/crates/is_palindrome/Cargo.toml new file mode 100644 index 0000000..c21a7e9 --- /dev/null +++ b/crates/is_palindrome/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "is_palindrome" +version = "0.1.0" +edition = "2021" + +[dependencies] + +[lints] +workspace = true diff --git a/crates/is_palindrome/src/lib.rs b/crates/is_palindrome/src/lib.rs new file mode 100644 index 0000000..0abcd76 --- /dev/null +++ b/crates/is_palindrome/src/lib.rs @@ -0,0 +1,57 @@ +#[must_use] +pub fn is_palindrome(s: String) -> bool { + if s.trim().is_empty() { + return true; + } + + let bytes = s.as_bytes(); + + let mut left_pointer = 0; + let mut right_pointer = bytes.len() - 1; + + while left_pointer < right_pointer { + if !bytes[left_pointer].is_ascii_alphanumeric() { + left_pointer += 1; + continue; + } + + if !bytes[right_pointer].is_ascii_alphanumeric() { + right_pointer -= 1; + continue; + } + + if bytes[left_pointer].to_ascii_lowercase() != bytes[right_pointer].to_ascii_lowercase() { + return false; + } + + left_pointer += 1; + right_pointer -= 1; + } + + true +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn case_1() { + assert!(is_palindrome(String::from("A man, a plan, a canal: Panama"))); + } + + #[test] + fn case_2() { + assert!(!is_palindrome(String::from("race a car"))); + } + + #[test] + fn case_3() { + assert!(is_palindrome(String::from(" "))); + } + + #[test] + fn case_4() { + assert!(is_palindrome(String::from("f f"))); + } +} diff --git a/crates/valid_anagram/src/lib.rs b/crates/valid_anagram/src/lib.rs index c22fb79..cafe7e9 100644 --- a/crates/valid_anagram/src/lib.rs +++ b/crates/valid_anagram/src/lib.rs @@ -1,7 +1,6 @@ use std::collections::HashMap; #[must_use] -#[allow(clippy::needless_pass_by_value)] pub fn is_anagram(s: String, t: String) -> bool { if s.len() != t.len() { return false;