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.
判断一个字符串是不是回文串。
这道题目不是很难,但是需要注意的细节却很多,我一共提交了6、7次才ac,每次都是一点点小问题,看来时间长不写代码是不行的啊
设置两个指针,left和right,分别指向字符串的左边和右边,然后遍历,直到left >right,循环结束
bool isChar(char c)
{
//此函数出现的问题
// 最开始写作 c>='0' && c <='10' 其中是没有'10'这个字符的!!!
/*也可以这样
if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
return true;
else
{
return false;
}
*/
if (c >= '0' && c < '9')
return true;
else if (c >= 'a'&&c <= 'z')
return true;
else if (c >= 'A'&&c <= 'Z')
return true;
else
return false;
}
char getLowercase(char c){
if (c >= 'A' && c <= 'Z')
return (c + 32);
else
return c;
}
bool isPalindrome(string s) {
/*需要考虑的情况:
1.空串
2.非空串,但是没字符或者数字的串,如“,。”
3.数字的ascii码不是 0~9 而是‘0’ ~‘9’
*/
if (s.empty()){
return true;
}
int left = 0;
int right = s.size() - 1;
while (left < right)
{
while (!isChar(s[left]) && left<right){
left++;
}
//find left
while (!isChar(s[right]) && left<right){
right--;
}
//find right
if (left > right)//这里,对于‘,.’这样的判断
return false;
if (getLowercase(s[left]) == getLowercase(s[right])){
left++;
right--;
}
else{
return false;
}
}
return true;
}