题目描述
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
示例 1:
输入: “aba”
输出: True
示例 2:
输入: “abca”
输出: True
解释: 你可以删除c字符。
思路
1.双指针
class Solution {
public boolean validPalindrome(String s) {
boolean first = false;
char[] arr = s.toCharArray();
int b = 0;
int e = arr.length - 1;
while(b <= e){
char c1 = arr[b];
char c2 = arr[e];
if(c1 == c2){
b++;
e--;
}else{
if(!first){
if(b+2 < arr.length && arr[b+1] == c2 && arr[b+2] == arr[e-1]){
b++;
}else if(e-2 >= 0 && c1 == arr[e-1] && arr[b+1] == arr[e-2]){
e--;
}else if(b+2 >= arr.length/2){
b++;
}
first = true;
}else{
return false;
}
}
}
return true;
}
}
2.递归版
参考CYC写的,写的真优美
class Solution {
public boolean validPalindrome(String s) {
char[] arr = s.toCharArray();
int b = 0;
int e = arr.length - 1;
while(b < e){
if(arr[b] != arr[e]){
return isPar(arr,b+1,e)||isPar(arr,b,e-1);
}
b++;
e--;
}
return true;
}
public boolean isPar(char[] arr,int p1,int p2){
while(p1 <= p2){
if(arr[p1] != arr[p2]){
return false;
}
p1++;
p2--;
}
return true;
}
}