class Solution {
public:
bool check(const string &s,int l,int r){ //判断字符串是否为回文串
for(int i=l,j=r;i<j;++i,--j){
if(s[i]!=s[j]){
return false;
}
}
return true;
}
bool validPalindrome(string s) {
int l=0,r=s.size()-1;
while(l<r){
char c1=s[l],c2=s[r];
if(c1==c2){
++l;
--r;
}else{
return check(s,l,r-1)||check(s,l+1,r);
//算法核心步骤,每次字符不相等时,尝试判断删除最左或右的字符,如果删除后是回文串,则符合要求
}
}
return true;
}
/*如果 s[0]=s[n−1],那么必须删字母,可以删 s[0] 或 s[n−1],问题变成判断剩余子串(在不能删字母的情况下)是不是回文的。
如果 s[0]=s[n−1],是否需要删字母呢?比如 s=aabcba 满足 s[0]=s[n−1],并且删掉 s[0] 后可以得到回文串 abcba。
但如果删除 s[0] 能得到回文串,说明 s[0]=s[n−1]=s[1]=a,我们也可以改为删除 s[1],得到完全一样的回文串 abcba。
这意味着,如果 s[0]=s[n−1],不删除 s[0] 也不删除 s[n−1],是不会错过正确答案的!
问题变成判断下标在 [1,n−2] 的子串,能否在删至多一个字母的情况下变成回文串。
这是一个规模更小的子问题,重复上述过程解决。*/