125. Valid Palindrome

Description of the Problem

A phrase is a palindrome if, after converting all uppercase letters into lowercase letters and removing all non-alphanumeric characters, it reads the same forward and backward. Alphanumeric characters include letters and numbers.

Given a string s, return true if it is a palindrome, or false otherwise.

Example 1:

Input: s = "A man, a plan, a canal: Panama"
Output: true
Explanation: "amanaplanacanalpanama" is a palindrome.

Example 2:

Input: s = "race a car"
Output: false
Explanation: "raceacar" is not a palindrome.

Example 3:

Input: s = " "
Output: true
Explanation: s is an empty string "" after removing non-alphanumeric characters.
Since an empty string reads the same forward and backward, it is a palindrome.

Constraints:

  • 1 <= s.length <= 2 * 10^5
  • s consists only of printable ASCII characters.

Solution

Code (Rust)

impl Solution {
    pub fn is_palindrome(s: String) -> bool {
        let mut s = s;
        s = s.to_lowercase();

        let s = s.chars().collect::<Vec<char>>();

        let mut i = 0;
        let mut j = s.len() - 1;

        while i < j {
            let (a,b) = (s[i], s[j]);
            match ( a.is_alphanumeric(), b.is_alphanumeric() ) {
                (true, true) => if a != b {return false} else {i+=1; j-=1;},
                (true, false) => j-=1,
                (false, true) => i+=1,
                (false, false) => {i+1; j-=1;}
            }
        }

        return true;
    }
}

Complexity

  • n is the length of string

Time complexity:

  • \( T(n) = O(n) \)

Auxiliary Space:

  • \( S(n) = O(n) \ / \ O(1) \)
    • Depends on implementation.