1.题目描述:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
示例 2:
输入: “race a car”
输出: false
2.主要思想
我们可通过类比快速排序的方法,用前[begin]和后[end]两个下标控制,分别从两头跳过空格一直找到数字或者字母停止,二者进行比较,如果二者不同则返回false,如果二者相同则继续寻找再比较,直到所有的字母或者数字都比较完就结束。
难点: 由于要比较的字符既有数字又有字母,而计算机里只存字符的ASCII码值,所以比较字符是否相等是我们的首要任务。
方法 一: 直接用找到的字符判断begin和end位置的字符是否相等(忽略字母的大小写)
因为(a+32)%32与(A+32)%32的值相等,所以我们可以用下面的条件判断:
if(begin<end)
{
if ((s[begin]+32-'a')%32!=(s[end]+32-'a')%32))
return false;
++begin;
--end;
}
方法二: 若找到的字符是大写字母则转换为小写字母,再直接对二者的比较。即:
//if(c>='A'&&c<='Z')
//c+=32;
if(begin<end)
{
if (s[begin]!=s[end])
return false;
++begin;
--end;
}
完整代码:
class Solution {
public:
bool isPalindrome(string s) {
if(s.empty()!=0)
return true;
int begin=0;
int end=s.size()-1;
char* p=(char*)s.c_str();
while(begin<=end)
{
while(begin<end)
{
if(IsNumber(s[begin]))
break;
++begin;
}
while(begin<end)
{
if(IsNumber(s[end]))
break;
--end;
}
if(begin<=end)
{
if(s[begin]!=s[end])
//if((s[begin]+32-'a')%32!=(s[end]+32-'a')%32)
return false;
begin++;
end--;
}
}
return true;
}
bool IsNumber(char& c)
{
if(c>='A'&&c<='Z')
c+=32;
if(c>='0'&&c<='9'|| c>='a'&&c<='z')
{
return true;
}
return false;
}
// bool IsNumber(char c)
//{
// if(c>='0'&&c<='9'||
// c>='a'&&c<='z'||
// c>='A'&&c<='Z')
// {
// return true;
// }
// return false;
// }
};