题目:给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
示例 1:
输入: “aba”
输出: True
示例 2:
输入: “abca”
输出: True
解释: 你可以删除c字符。
思路:可以删除一次,因此,遇到不一样的字符时,我们需要判断删除左边一个剩下的是不是回文串和删除右边的一个剩下的是不是回文串。使用双指针。
class Solution {
public boolean validPalindrome(String s) {
int left = 0;
int right = s.length()-1;
boolean flag = false;
int count =0;
while(left<right){
if(s.charAt(left) == s.charAt(right)){
left++;
right--;
}else{
//需要分别求剩下的两部分,不能只求一部分
boolean flag1 = true;
boolean flag2 = true;
for(int i=left,j=right-1;i<j;i++,j--){
if(s.charAt(i) != s.charAt(j)){
flag1 = false;
break;
}
}
for(int i= left+1,j=right;i<j;i++,j--){
if(s.charAt(i) != s.charAt(j)){
flag2= false;
break;
}
}
return flag1 || flag2;//这边加上 或 的原因是,可以改变一次,当两个都为false时,说明改变了两次
}
}
return true;
}
}
第二种写法:
class Solution {
public boolean validPalindrome(String s) {
for(int i=0,j=s.length()-1;i<j;i++,j--){
if(s.charAt(i) != s.charAt(j)){//两种情况:一种是向左边走,一种是向右边走
return equalto(s,i+1,j) || equalto(s,i,j-1);
}
}
return true;
}
public boolean equalto(String s,int i,int j){
while(i<j){
if(s.charAt(i++) != s.charAt(j--)){
return false;
}
}
return true;
}
}