题目
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.
分析与思路
题目比较简单,考察string一些常用函数的用法和ASCII表的一些知识。解题时要对字母和数字进行筛查,并且要注意不区分大小写。最后,注意题目规定空字符串也是合法的Palindrome。
思路很简单,定义两个游标i和j。i从0向后开始筛查每个字符,j则从最后一个字符开始向前筛查。如果发现合法字符(字母、数字)则进行对比,如果不同(同一字母的大小写认为是相同)则返回false,相同则继续。在筛查的时候一定要注意判断是否越界,我第一次提交的时候就是因为忘记了判断导致出错。最后,如果发现i>=j则返回true。
个人认为整个题目比较容易出错的地方主要有这么几个吧:
1)字母的筛查,要熟悉ASCII表,’Z‘后并不是紧跟着’a‘,中间还有’.‘ ’`‘等字符;
2)C++编程,一定要时刻记得判断是否越界;
3)空字符的处理。
OK,代码如下:
class Solution {
public:
bool isAlphanumericCharacter(char c)
{
//0:48 9:57 A:65 Z:90 a:97 z:122
unsigned short c_int = int(c);
if(c_int>47 && c_int<58)
return true;
else if(c_int>64 && c_int<91)
return true;
else if(c_int>96 && c_int<123)
return true;
else
return false;
}
bool isPalindrome(string s) {
int length_s = s.length();
for(int i=0,j=length_s-1;i<j;i++,j--)
{
while(!isAlphanumericCharacter(s.at(i)))
{
i++;
if(i>=length_s) break;
}
while(!isAlphanumericCharacter(s.at(j)))
{
j--;
if(j<0) break;
}
if(i<j)
{
if( (int(s.at(i) - s.at(j)) != 0)
&& (int(s.at(i) - s.at(j)) != 32)
&& (int(s.at(i) - s.at(j)) != -32)
)
return false;
}
}
return true;
}
};