题目描述:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
示例 2:
输入: “race a car”
输出: false
主要思路:
(1)使用双指针从两端相中间进行比较;
(2)这里主要只判断字母和数字,且字母不区分大小写,故在处理时,需要跳过非字母和数字的字符,且对大小写单独判断;
class Solution {
public:
bool isPalindrome(string s) {
if(s.empty())
return true;
//双指针
int front=0;
int back=s.size()-1;
//整体上的双指针
while(front<back){
//front跳过非字母和数字的字符
while(front<back){
if((s[front]>='a'&&s[front]<='z')||(s[front]>='A'&&s[front]<='Z')||(s[front]>='0'&&s[front]<='9'))
break;
++front;
}
//back跳过非字母和数字的字符
while(front<back){
if((s[back]>='a'&&s[back]<='z')||(s[back]>='A'&&s[back]<='Z')||(s[back]>='0'&&s[back]<='9'))
break;
--back;
}
//判断现在两个指针所指向的情形
if(front<=back){
//正常的相等
if(s[front]==s[back]){
++front;
--back;
}
//front指向的为小写字母时,将back的转化为小写的进行比较
else if(s[front]>='a'&&s[front]<='z'&&(s[front]==s[back]-'A'+'a')){
++front;
--back;
}
//front指向为大写字母时,将back的转化为大写的进行比较
else if(s[front]>='A'&&s[front]<='Z'&&(s[front]==s[back]-'a'+'A')){
++front;
--back;
}
else
return false;//不满足要求的,返回false
}
else
return false;
}
return true;
}
};