验证回文字符串II
class Solution {
public:
bool ishui(string s,int i,int j)
{
string s1=s.substr(i,j-i+1);
auto s2=s1;
//reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
//auto cmp2=s2+s1;
return s1==s2;
}
bool validPalindrome(string s) {
//只删首尾/不删的情况分开考虑
//1.不删
auto tmps1=s;
reverse(tmps1.begin(),tmps1.end());
if(tmps1==s){return true;}
//2.只删首尾
//2.1只删首
auto tmps21=s.substr(1,s.size()-1);
auto tmps22=tmps21;
reverse(tmps21.begin(),tmps21.end());
if(tmps21==tmps22){return true;}
//2.2只删尾
auto tmps31=s.substr(0,s.size()-1);
auto tmps32=tmps31;
reverse(tmps31.begin(),tmps31.end());
if(tmps31==tmps32){return true;}
/*for(int i=1;i<s.size()-1;i++)
{
if(ishui(s,i)){return true;}
}*/ //暴力超时
//那就从左右往中间遍历,允许一次不对称,跳一位,此后再不对称就false
int l=0,r=s.size()-1;
int flag=0;
while(l<r)
{
if(s[l]==s[r]){l++;r--;continue;}
if(s[l]!=s[r]&&flag==0)//允许跳一位,那么左右分别裁一位,判断是否回文
{
//1.裁左
if(ishui(s,l+1,r))
{
return true;
}
//2.裁右
else if(ishui(s,l,r-1))
{
return true;
}
else return false;
}
}
return true;
}
};