680. Valid Palindrome II
2017-12-28 本文已影响0人
夏臻Rock
题目:
给你一个字符串,判断至多删掉一个字符串能不能让这个字符串变成回文串。
题目
解析:
又是一道回文字符串判断的问题,不同的是,它可以至多删去一个字符,那么我们要先对原字符串进行回文判断,如果不是回文,再考虑删除它某个字符后能不能形成回文串。
思路:
判断回文,我首先想到的还是分为奇数和偶数情况,进行中心对称判断。如果一个奇数长度的字符串不是回文,那么删去对应位置上但是不相同的字符中的某一个,生成两个偶数长度的字符串,再判断这两个偶数长度的字符串是否是回文,只要有一个是回文,那么返回true;否则返回false。
具体代码实现如下:
代码:
class Solution {
public boolean validPalindrome(String s) {
if(s==null || s.length()==0 || s ==""){
return false;
}
int slen = s.length();
//对于奇数长度的串
if(slen%2==1){
int isodd = oddispalin(s);
if(isodd == 0){
return true;
}else{
int pos = isodd -1;
String s1 = s.substring(0,pos)+s.substring(pos+1);
String s2 = s.substring(0,slen-pos-1)+s.substring(slen-pos);
if(evenispalin(s1)==0 ||evenispalin(s2)==0){
return true;
}
return false;
}
}
//对于偶数长度的串
else{
int iseven = evenispalin(s);
if(iseven == 0){
return true;
}else{
int position = iseven -1;
String s1 = s.substring(0,position)+s.substring(position+1);
String s2 = s.substring(0,slen-position-1)+s.substring(slen-position);
if(oddispalin(s1)==0 ||oddispalin(s2)==0){
return true;
}
return false;
}
}
}
//判断偶数长度字符串是不是回文串
private int evenispalin(String str){
int issplin = 0; //为0表示该字符串是回文
int length = str.length();
for(int i = 0;i<length/2;i++){
if(str.charAt(i)!=str.charAt(length-i-1)){
issplin = i+1;//不是回文子串,则返回不对称的位置
return issplin;
}
}
return issplin;
}
//判断奇数长度字符串是不是回文串
private int oddispalin(String str){
int issplin = 0; //为0表示该字符串是回文
int len = str.length();
int center = len/2 ; //中心对称
int sum =0;//记录不对称的次数
for(int i =0;i<center;i++){
if(str.charAt(i)!=str.charAt(len-i-1)){
issplin = i+1;//不是回文子串,则返回不对称的位置
return issplin;
}
}
return issplin;
}
}
后记:
怎么说呢,这是一道esay的题目,但是我前后花了不少时间,真是展现了我智障般的编程能力。[手动笑哭……] 虽然最后还是实现了,但是对自己的答题时间非常不满意,希望以后能有所长进吧。
而且如上解决方法应该不是最佳实践,还是得继续研究 [手动捂脸……]