题目
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。
示例 1:
输入: s = "aba"
输出: true
示例 2:
输入: s = "abca"
输出: true
解释: 你可以删除c字符。
示例 3:
输入: s = "abc"
输出: false
提示:
1 <= s.length <= 105
s 由小写英文字母组成
代码
class Solution {
public boolean id=false;
public boolean validPalindrome(String s) {
int left=0;
int right=s.length()-1;
char[] nums=s.toCharArray();
while(left<=right)
{
while(left<=right&&nums[left]==nums[right])
{
left++;right--;
}
if(left<=right&&nums[left]!=nums[right])
{
if(id)return false;
id=true;
StringBuffer str1=new StringBuffer();
str1.append(s.substring(0,left));
str1.append(s.substring(left+1,s.length()));
StringBuffer str2=new StringBuffer();
str2.append(s.substring(0,right));
str2.append(s.substring(right+1,s.length()));
///System.out.println("str1 "+str1+"str2 "+str2+" "+id);
return validPalindrome(str1.toString())||validPalindrome(str2.toString());
}
}
return true;
}
}
反思
还有更简洁的方法,
class Solution {
public boolean id=false;
public boolean validPalindrome(String s) {
int left=0;
int right=s.length()-1;
char[] nums=s.toCharArray();
while(left<=right)
{
while(left<=right&&nums[left]==nums[right])
{
left++;right--;
}
if(left<=right&&nums[left]!=nums[right])
{
if(id)return false;
id=true;
StringBuffer str1=new StringBuffer();
str1.append(s.substring(left+1,right+1));
StringBuffer str2=new StringBuffer();
str2.append(s.substring(left,right));
///System.out.println("str1 "+str1+"str2 "+str2+" "+id);
return validPalindrome(str1.toString())||validPalindrome(str2.toString());
}
}
return true;
}
}