题目链接
题目描述
给定一个非空字符串 s,请判断如果 最多 从字符串中删除一个字符能否得到一个回文字符串。
示例 1:
输入: s = "aba"
输出: true
示例 2:
输入: s = "abca"
输出: true
解释: 可以删除 "c" 字符 或者 "b" 字符
示例 3:
输入: s = "abc"
输出: false
提示:
1 <= s.length <= 105
s 由小写英文字母组成
解题思路
一开始想的是直接暴力,先判断不删除是不是回文子串,然后遍历字符串,每个位置都做删除操作,完成后判断是不是回文串,结果超时,然后又直接用dfs,思路大体是对了,但是还是会超时
然后就看了一下题解,是先对撞指针判断,如果不一样了,dfs(left,right-1)||dfs(left+1,right)两者成立一个就行
if(s[left]!=s[right]){
return dfs(left+1,right,s)||dfs(left,right-1,s);
}
题解
class Solution {
public:
bool dfs(int left,int right,string s){
while(left<right){
if(s[left]!=s[right]) return false;
else{
left++;
right--;
}
}
return true;
}
bool validPalindrome(string s) {
string x=s;
reverse(x.begin(),x.end());
int left=0;
int right=s.length()-1;
while(left<right){
if(s[left]!=s[right]){
return dfs(left+1,right,s)||dfs(left,right-1,s);
}else{
left++;
right--;
}
}
return true;
}
};