題目:
給你一個(gè)字符串,判斷至多刪掉一個(gè)字符串能不能讓這個(gè)字符串變成回文串。
題目
解析:
又是一道回文字符串判斷的問(wèn)題,不同的是,它可以至多刪去一個(gè)字符,那么我們要先對(duì)原字符串進(jìn)行回文判斷,如果不是回文,再考慮刪除它某個(gè)字符后能不能形成回文串。
思路:
判斷回文,我首先想到的還是分為奇數(shù)和偶數(shù)情況,進(jìn)行中心對(duì)稱判斷。如果一個(gè)奇數(shù)長(zhǎng)度的字符串不是回文,那么刪去對(duì)應(yīng)位置上但是不相同的字符中的某一個(gè),生成兩個(gè)偶數(shù)長(zhǎng)度的字符串,再判斷這兩個(gè)偶數(shù)長(zhǎng)度的字符串是否是回文,只要有一個(gè)是回文,那么返回true;否則返回false。
具體代碼實(shí)現(xiàn)如下:
代碼:
class Solution {
public boolean validPalindrome(String s) {
if(s==null || s.length()==0 || s ==""){
return false;
}
int slen = s.length();
//對(duì)于奇數(shù)長(zhǎng)度的串
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;
}
}
//對(duì)于偶數(shù)長(zhǎng)度的串
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;
}
}
}
//判斷偶數(shù)長(zhǎng)度字符串是不是回文串
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;//不是回文子串,則返回不對(duì)稱的位置
return issplin;
}
}
return issplin;
}
//判斷奇數(shù)長(zhǎng)度字符串是不是回文串
private int oddispalin(String str){
int issplin = 0; //為0表示該字符串是回文
int len = str.length();
int center = len/2 ; //中心對(duì)稱
int sum =0;//記錄不對(duì)稱的次數(shù)
for(int i =0;i<center;i++){
if(str.charAt(i)!=str.charAt(len-i-1)){
issplin = i+1;//不是回文子串,則返回不對(duì)稱的位置
return issplin;
}
}
return issplin;
}
}
后記:
怎么說(shuō)呢,這是一道esay的題目,但是我前后花了不少時(shí)間,真是展現(xiàn)了我智障般的編程能力。[手動(dòng)笑哭……] 雖然最后還是實(shí)現(xiàn)了,但是對(duì)自己的答題時(shí)間非常不滿意,希望以后能有所長(zhǎng)進(jìn)吧。
而且如上解決方法應(yīng)該不是最佳實(shí)踐,還是得繼續(xù)研究 [手動(dòng)捂臉……]