125. Valid Palindrome

Easy

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 * 105

  • s consists only of printable ASCII characters.

解題

func isPalindrome(s string) bool {
    str := ""
    
    for _, val := range(s) {
        if val>=65 && val<=90 {
            str+= string(val+32)
        } else if ( val>=97 && val<=122 ) || (val>=48 && val<=57) {
            str+= string(val)
        }
    }
    
    start := 0
    end := len(str)-1
    for start<=end {
        if str[start]!=str[end] {
            return false
        }
        start++
        end--
    }
    
    return true
}

討論區看到的另一個漂亮解法:

func isPalindrome(s string) bool {
    i, j := 0, len(s)-1
    for i < j {
        if !isValid(s[i]) {
            i++
            continue
        }
        if !isValid(s[j]) {
            j--
            continue
        }
        if !strings.EqualFold(string(s[i]), string(s[j])) {
            return false
        }
        i++
        j--
    }
    return true
}

func isValid(a byte) bool {
    if (a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z') || (a >= '0' && a <= '9') {
        return true
    }
    return false
}

Last updated