leetcode_rust/
valid_palindrome.rs1#![allow(dead_code)]
2
3pub fn is_palindrome(s: String) -> bool {
5 if s.len() < 1 {
6 return true;
7 }
8 let s = s.into_bytes();
9 let mut i = 0;
10 let mut j = s.len() - 1;
11 while i < j {
12 if !s[i].is_ascii_alphanumeric() {
13 i += 1;
14 continue;
15 }
16 if !s[j].is_ascii_alphanumeric() {
17 j -= 1;
18 continue;
19 }
20 let c1 = s[i];
21 let c2 = s[j];
22 if c1.to_ascii_lowercase() != c2.to_ascii_lowercase() {
23 return false;
24 }
25 i += 1;
26 j -= 1;
27 }
28 true
29}
30
31pub fn is_palindrome2(s: String) -> bool {
33 let mut s1 = vec![];
34 for c in s.into_bytes() {
35 if c.is_ascii_alphanumeric() {
36 s1.push(c.to_ascii_lowercase());
37 }
38 }
39 let mut s2 = s1.clone();
40 s2.reverse();
41 s1 == s2
42}
43
44#[cfg(test)]
45mod tests {
46 use super::*;
47
48 #[test]
49 fn test1() {
50 assert_eq!(is_palindrome(String::from(".,")), true);
51
52 assert_eq!(
53 is_palindrome(String::from("A man, a plan, a canal: Panama")),
54 true
55 );
56 assert_eq!(is_palindrome(String::from(".a")), true);
57 assert_eq!(is_palindrome(String::from("!!!")), true);
58 assert_eq!(is_palindrome(String::from("a.")), true);
59 }
60
61 #[test]
62 fn test2() {
63 assert_eq!(
64 is_palindrome2(String::from("A man, a plan, a canal: Panama")),
65 true
66 );
67 assert_eq!(is_palindrome2(String::from(".a")), true);
68 assert_eq!(is_palindrome2(String::from("a.")), true);
69 assert_eq!(is_palindrome2(String::from(".,")), true);
70 }
71}