leetcode_rust/
valid_palindrome.rs

1#![allow(dead_code)]
2
3// double pointers
4pub 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
31// reverse string
32pub 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}