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.

```class Solution {
public:
bool isValid(char c)
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z')||(c>='0'&&c<='9'))return true;
return false;
}
bool isSame(char c1, char c2)
{
if(c1>='0'&&c1<='9')return c1==c2;
if((c1>='A'&&c1<='Z'))return (c1==c2)||(c1==c2-32);
if(c1>='a'&&c1<='z')return (c1==c2)||(c1==c2+32);
}
bool isPalindrome(string s) {
if(s.empty()||s.size()==1)return true;
int n=s.size();
int i=0,j=n-1;
for(;i<n&&j>=0&&i<=j;)
{
//            if(i==j)return true;
while(!isValid(s[i]))i++;
while(!isValid(s[j]))j--;
if(i==j||i>j)return true;
if(!isSame(s[i],s[j]))return false;
i++;
j--;
}
if(i==j||i>j)return true;
return false;
}
};```