题目:
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串
输入: s = "aba"
输出: true
### 解题思路
采用双指针的方法,两边同时移动。
设i=0,j=s.size()-1,因为这是回文,所以两边应该是对称的。
如果i==j,则i++,j--;
如果i!=j,则考虑删除i或者j所对应的字符;
(1)删除i所对应的字符,如果此时构成回文串,返回true,否则转入(2)
(2)删除j所对应的字符,如果此时构成回文串,返回true,否则返回(3)
在这一题上我卡了挺久(题目标注简单题QAQ)
做完之后看官方题解,发现我一直在研究怎么在一个函数里实现这些功能,但是如果分成两个函数来计算就容易多了。
bool validPalindrome(string s) {
int len=s.size(),m=0,n=0,i=0,j=len-1;
while(i<=j){
if(s[i]==s[j]){
++i;
--j;
continue;
}else{
break;
}
}
m=i;
n=j;
i++;
while(i<=j){
if(s[i]==s[j]){
++i;
--j;
continue;
}else{
break;
}
}
if(i>j) return true;
i=m;
j=n;
j--;
while(i<=j){
if(s[i]==s[j]){
++i;
--j;
continue;
}else{
return false;
}
}
return true;
}
int main(){
string s="cbbcc";
cout<<validPalindrome(s);
return 0;
}