Valid Palindrome

July 5, 2025

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

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
}