这道题的暴力解法很简单,先check如果不删除任何字符,是否字符串是回文,如果不是,再挨个删除每个字符,check删除字符之后是否是回文。

时间复杂度O(n2), n是字符串s的长度,字符串很长的情况下会TLE,算法如下:

class Solution {
    public boolean validPalindrome(String s) {
        if(checkPalindrom(s))
            return true;
        for(int i=0;i<s.length();i++){
            if(checkPalindrom(s.substring(0, i)+s.substring(i+1)))
                return true;
        }
        return false;
        
    }
    
    private boolean checkPalindrom(String s){
        int i=0, j=s.length()-1;
        while(i<j){
            if(s.charAt(i)==s.charAt(j)){
                i++;
                j--;
            }
            else
                return false;
        }
        return true;
    }
}

上面的算法,每删掉一个字符,就要从头到尾重新挨个字符check一遍字符串,其实这个过程可以one pass,而且这个算法可以延伸到去掉任意数量的字符.

时间复杂度O(n), 算法如下:

class Solution {
    public boolean validPalindrome(String s) {
        return helper(s, 0, s.length()-1, 0);
    }
    
    private boolean helper(String s, int i, int j, int sum){
        if(sum>1)
            return false;
        while(i<j && s.charAt(i)==s.charAt(j)){
            i++;
            j--;
        }
        if(i>=j)
            return true;
        return helper(s, i+1, j, sum+1) || helper(s, i, j-1, sum+1);
    }
}

或者:

class Solution {
    public boolean validPalindrome(String s) {
        return helper(s, 0, s.length()-1, 0);
    }
    
    private boolean helper(String s, int i, int j, int count){
        if(count>1)
            return false;
        if(i>=j)
            return true;
        
        if(s.charAt(i)!=s.charAt(j))
            return helper(s, i+1, j, count+1)||helper(s, i, j-1, count+1);
        else
            return helper(s, i+1, j-1, count);
    }
}

 

下面的算法最多可以删除一个字符:

class Solution {
    public boolean validPalindrome(String s) {
        int i=0, j=s.length()-1;
        while(i<j){
            if(s.charAt(i)==s.charAt(j))
            {
                i++;
                j--;
            }
            else{
                return helper(s, i+1, j)||helper(s, i, j-1);
            }
        }
        return true;
    }
    
    private boolean helper(String s, int i, int j){
        while(i<j){
            if(s.charAt(i)!=s.charAt(j))
                return false;
            i++;
            j--;
        }
        return true;
    }
}

 

posted on 2022-01-03 05:25  阳光明媚的菲越  阅读(58)  评论(0编辑  收藏  举报