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的题目,但是我前后花了不少时间,真是展现了我智障般的编程能力。[手动笑哭……] 虽然最后还是实现了,但是对自己的答题时间非常不满意,希望以后能有所长进吧。
而且如上解决方法应该不是最佳实践,还是得继续研究 [手动捂脸……]

上一篇 下一篇

猜你喜欢

热点阅读