思路:可以将这个问题简化一下,最多可删除一个字符,有两种情况:一是没有删除,该字符串就是回文串;二是删除了一个字符串,这个删除也分两种情况,当检测它不是回文串是有两种选择:一种是删除左边,一种是删除右边,删除之后再检查是否是回文串,然后还有一个独立出来的问题就是怎么解决检测回文串,设置两个指针(下标)分别从左右开始检测
右指针:红色加粗,左指针:黑色加粗
abbca 左右指针相同,则左指针自加,右指针自减
abbca 左右指针不同,则两种情况,删右边,右指针自减,删左边,左指针自加
abca 删左边,不是回文串
abba 删右边,是回文串,则return true
若删左删右都不是回文串则return false
若左指针 >= 右指针了,则遍历结束
Java实现:
class Solution {
public boolean validPalindrome(String s) {
int left = 0;
int right = s.length() - 1;
while(left < right){
if(s.charAt(left) == s.charAt(right)){
left++;
right--;
}else{
return check(s,left + 1,right) || check(s,left,right - 1);
}
}
return true;
}
public boolean check(String s,int left,int right){
for(int i = left,j = right;i < j;i++,j--){
if(s.charAt(left) != s.charAt(right)){
return false;
}
}
return true;
}
}