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.
Input: s = "A man, a plan, a canal: Panama"
Output: true
Explanation: "amanaplanacanalpanama" is a palindrome.
Input: s = "race a car"
Output: false
Explanation: "raceacar" is not a palindrome.
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.
The problem requires us to determine if a given string is a palindrome, considering only alphanumeric characters and ignoring cases. The basic idea is to first clean the string by removing all non-alphanumeric characters and converting everything to a consistent case (lowercase). Then, use two pointers to compare characters from the start and end of the string moving inwards.
The previous solution effectively checks the palindrome by cleaning up the string first. However, we can optimize it to not require extra space for a cleaned version. Instead, directly use two pointers on the input string to perform the checking while skipping over non-alphanumeric characters.