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.
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
思路:
1.只剩下字母
2.转化为小写
3.回文比较
#include <iostream>
using namespace std;
class Solution{
public:
//转换大小写
string low(string s)
{
for(int i=0;i<s.length();i++)
{
if(s[i]>='A' && s[i]<='Z') s[i] = s[i] - 'A' + 'a';
}
return s;
}
//判断是否是字母或者数字
bool isAlpha(char c)
{
if((c>='a' && c<='z') || (c>='0' && c<='9')) return true;
return false;
}
bool isPalindrome(string s)
{
//转换大小写
s=low(s);
//左右夹逼,判断是不是回文字符串
int left = 0;
int right = s.length() -1;
while(left < right)
{
while(left<s.length()&&!isAlpha(s[left]))
{
left ++;
}
while(right >=0 && !isAlpha(s[right]))
{
right --;
}
if(left>right || left>=s.length()||right <0) break;//异常处理,比如空字符串
if(s[left]!=s[right])
{
return false;
}
left++;
right--;
}
return true;
}
};
void main()
{
string s="";
Solution *sol = new Solution();
bool flag = sol->isPalindrome(s);
printf("The string is %s Palindrome.\n",flag?"true":"false");
delete sol;
}