680. Valid Palindrome II

題目:

給你一個(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)捂臉……]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容