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
判断是否为回文串,一般是用双指针,一个指针从前遍历,一个从后遍历,如果不同,直接返回FALSE,如果相同,则同时前进。
本题需考虑:
大写和小写当成一样,则可以考虑为和大写A或者小写A的距离。(1)
由于还有数字,如果考虑数字到0的距离,会造成数字和大小写分不开的情况,则判断数字和‘\0’的距离(2)
遍历的时候,不是字母和数字,就直接跳过。(3)
class Solution {
public:
bool isPalindrome(string s) {
int len = s.length();
int be = 0, en = len - 1;
char beg, fin;
while (be <= en)
{
char beg = NULL, fin = NULL;
for (int i = be; i <= en; ++i)
{
if (s[i] >= 'A' && s[i] <= 'Z' || s[i] >= 'a' && s[i] <= 'z')
{
beg = (s[i] >= 'A' && s[i] <= 'Z')? s[i] - 'A':s[i] - 'a';
be = i;
break;
}
else if (s[i] >= '0' && s[i] <= '9' )
{
beg = s[i] - '\0';
be = i;
break;
}
}
for (int i = en; i >= be; --i)
{
if (s[i] >= 'A' && s[i] <= 'Z' || s[i] >= 'a' && s[i] <= 'z')
{
fin = (s[i] >= 'A' && s[i] <= 'Z')? s[i] - 'A':s[i] - 'a';
en = i;
break;
}
else if (s[i] >= '0' && s[i] <= '9' )
{
fin = s[i] - '\0';
en = i;
break;
}
}
if (beg != fin)
{
return false;
}
++be;
--en;
}
return true;
}
};