Leetcode Note: Go - Valid Palindrome

Valid Palindrome - LeetCode
https://leetcode.com/problems/valid-palindrome/

  • Go 言語で取り組んだメモ

所感

  • 文字データを取り出して比較する感じになりそう

回答

Go solution with comments - LeetCode Discuss
https://leetcode.com/problems/valid-palindrome/discuss/1571282/Go-solution-with-comments

func isPalindrome(s string) bool {
    left, right := 0, len(s) - 1
    
    for left < right {
        l := rune(s[left])
        r := rune(s[right])
        
        // if char at left if not a letter or digit increment the left pointer
        if !unicode.IsLetter(l) && !unicode.IsDigit(l) {
            left++
        } else if !unicode.IsLetter(r) && !unicode.IsNumber(r) { // if char at right if not a letter or digit decrement the right pointer
            right--
        } else if unicode.ToLower(l) == unicode.ToLower(r) { // if both are same chars increment left pointer and decrement right pointer
            left++
            right--
        } else { // if none of the above conditions are satisified this is not a palindrome
            return false
        }
    }
    
    return true
}
  • init
    • left を 0 で初期化
    • right を len(s) - 1 で初期化
  • left < right 条件でループ
    • l が IsLetter でも IsDigit でもなければ left++
    • r が IsLetter でも IsDigit でもなければ right–
    • l と r を ToLower した結果が等価なら left++, right–
    • どれでもなければ Palindrome として成立しないもの判定して return false
  • ループを経過したら return true