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^5sconsists 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.