# 原题

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

For example,
`"A man, a plan, a canal: Panama"` is a palindrome.
`"race a car"` is not a palindrome.

Note:
Have you consider that the string might be empty? This is a good question to ask during an interview.

For the purpose of this problem, we define empty string as valid palindrome.

# 代码

## C++

```class Solution {
public:
bool isPalindrome(string s) {
if (s.length() == 0) return true;
// filter
string fs;
for (int i = 0; i < s.length(); ++i) {
if ((48 <= s[i] && s[i] <= 57) || (65 <= s[i] && s[i] <= 90) || (97 <= s[i] && s[i] <= 122)) {
if (65 <= s[i] && s[i] <= 90) s[i] = tolower(s[i]);
fs.append(s, i, 1);
}
}

int fsl = fs.length();
for (int i = 0; i < fsl / 2; ++i)
if (fs[i] - fs[fsl - i - 1] != 0) return false;

return true;
}
};
```

## Python

```import re
class Solution:
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
s = re.sub('[^A-Za-z0-9]', '', s).lower()
return s == s[::-1]
```