Question
Check if a given string is a palindrome — only considering alphanumeric characters and ignoring letter casing.
Skip punctuation, spaces, and special characters. A valid palindrome reads the same forward and backward.
Example
Input: "A man, a plan, a canal: Panama"
Output: true
Explanation: After cleaning:
"amanaplanacanalpanama"
Input: "race a car"
Output: false
My Notes
- Used two pointers: start and end.
-
Skip characters that aren’t alphanumeric using
unicode
. - Compare lowercase versions of characters.
- Return false on mismatch, true otherwise.
- Time: O(n), Space: O(1)
package main import ( "fmt" "unicode" ) func main() { result := isPalindrome("A man, a plan, a canal: Panama") fmt.Println(result) } func isAlphaNumeric(r rune) bool { return unicode.IsLetter(r) || unicode.IsDigit(r) } func isPalindrome(s string) bool { i := 0 j := len(s) - 1 for i < j { ri := rune(s[i]) rj := rune(s[j]) if !isAlphaNumeric(ri) { i++ continue } if !isAlphaNumeric(rj) { j-- continue } if unicode.ToLower(ri) != unicode.ToLower(rj) { return false } i++ j-- } return true }