---
# System prepended metadata

title: 125. Valid Palindrome
tags: [pointer, Leetcode, python, c++, easy]

---

###### tags: `Leetcode` `easy` `pointer` `python` `c++`

# 125. Valid Palindrome

## [題目來源:] https://leetcode.com/problems/valid-palindrome/

## 題目:
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.

## 解題想法:
因為有空格 可直接用.isalnum()來判斷是否為字母
head、tail指向s頭尾 依序比較是否相等

## Python:
``` python=
class Solution(object):
    def isPalindrome(self, s):
        """
        :type s: str
        :rtype: bool
        """
        head=0
        tail=len(s)-1
        while head<tail:
            #isalnum():字母或數字為true
            while head<tail and not s[head].isalnum(): #非字母
                head+=1
            while head<tail and not s[tail].isalnum():
                tail-=1
            if head<tail:
                if s[head].lower()!=s[tail].lower():
                    return False
                head+=1
                tail-=1
        return True

result = Solution()
s = "Abb"
#s = "A man, a plan, a canal: Panama"
ans = result.isPalindrome(s)
print(ans)
```

## C++
``` cpp=
#include<iostream>
#include<cctype>
using namespace std;

class Solution {
public:
    bool isPalindrome(string s) {
        int head=0;
        int tail=s.size()-1;
        while (head<tail){
            while (head<tail && !isalnum(s[head])){
                head+=1;
            }
            while (head<tail && !isalnum(s[tail])){
                tail-=1;
            }
            if (head<tail){
                //tolower: turn to lower
                if (tolower(s[head])!=tolower(s[tail]))
                    return false;
                head+=1;
                tail-=1;
            }
        }
        return true;
    }
};

int main(){
    Solution res;
    string s="AbAc";
    bool ans=res.isPalindrome(s);
    cout<<ans<<endl;
    return 0;
}

```