给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
bool isPalindrome(char *s)
{
int len = strlen(s);
char *stack = (char*)malloc(sizeof(char) * len);
int top = -1;
int i;
for (i = 0; i < len; i++) {
if ((s[i] >= '0' && s[i] <= '9') || (s[i] >= 'A' && s[i] <= 'Z') || s[i] >= 'a' && s[i] <= 'z') {
top++;
stack[top] = s[i];
}
}
// 回文串,正序和反序相同
for (i = 0; i < len; i++) {
if ((s[i] >= '0' && s[i] <= '9') || (s[i] >= 'A' && s[i] <= 'Z') || s[i] >= 'a' && s[i] <= 'z') {
// letter
// 用例里有一个0P的用例,他们的ascii码正好差32
// 所以需要区分letter和digit的比较
if (isalpha(s[i]) && ((s[i] == (stack[top] - 'a' + 'A')) || (s[i] == (stack[top] - 'A' + 'a')))) {
top--;
// digit
} else if (s[i] == stack[top]) {
top--;
} else {
return false;
}
}
}
return true;
}