思路:
- 设立双指针,一前一后遍历数组.
- 如果遇到了不同的字符,分为两种情况,分别是去掉前一个字符后,该字符串是否为回文数以及去掉后一个字符后,该字符串是否为回文数。
直接上代码
class Solution {
public:
bool isPali(int begin,int end,string s){
while(begin<end){
if(s[begin]!=s[end]) return false;
begin++;
end--;
}
return true;
}
bool validPalindrome(string s) {
int len=s.length();
int begin=0;
int end=len-1;
bool del_front=true;
bool del_back=true;
bool res=false;
bool once=true; //记录是不是第一次碰见需要删除的字符.
//如果begin=end的话也不用判断了.
while(begin<end){
//如果相等,滑动指针
if(s[begin]==s[end]){
begin=begin+1;
end=end-1;
continue;
}
//使用isPail可以让代码更简洁.如果不相等,只需要判断删了前面是否是回文或者删了后面是否是回文
return isPali(begin+1,end,s)||isPali(begin,end-1,s);
//不使用函数.代码就变得冗长了一些,
//如果不相等.分为删前和删后两种情况
/*
int del_front_begin=begin+1;
int del_front_end=end;
while(del_front_begin<del_front_end){
if(s[del_front_begin]==s[del_front_end]){
del_front_begin=del_front_begin+1;
del_front_end=del_front_end-1;
continue;
}
del_front=false;
break;
}
//如果删了前面的判断不是回文字符,看一下删了后面之后的是否是.
if(del_front==false){
int del_back_begin=begin;
int del_back_end=end-1;
while(del_back_begin<del_back_end){
if(s[del_back_begin]==s[del_back_end]){
del_back_begin=del_back_begin+1;
del_back_end=del_back_end-1;
continue;
}
//如果出现不相等,那么删了后面的也不是回文字符了.
return false;
}
return true;
}
//如果删了前面的发现是回文字符串,返回真即可。
else return true;*/
}
return true;
}
};