LeetCode 680. Valid Palindrome II 验证回文字符串 Ⅱ(C++/Java)

题目:

Given a non-empty string s, you may delete at most one character. Judge whether you can make it a palindrome.

Example 1:

Input: "aba"
Output: True

 

Example 2:

Input: "abca"
Output: True
Explanation: You could delete the character 'c'.

 

Note:

  1. The string will only contain lowercase characters a-z. The maximum length of the string is 50000.

分析:

给定一个非空字符串,在最多删去一个字符的前提下,判断是不是回文字符串。

由于删去一个字符也算是回文字符串,也就说以删去的字符为基础剩下的字符也同样应该是回文字符串。在这里我们以abcbda为例。

从前后开始比较字符是否相同,当发现b和d不同时,我们要删除一个字符,来继续判断剩下的字符串是否是回文字符串,因为字符不同,前后两个都可以删除,所以返回的两个结果取并集。删除b的话,显然cbd不构成回文字符串,而删除d的话bcb构成回文字符串。

程序:

C++

class Solution {
public:
    bool validPalindrome(string s) {
        int l = 0;
        int r = s.size()-1;
        while(l < r){
            if(s[l] != s[r]){
                return isPalindrome(s, l+1, r) || isPalindrome(s, l, r-1);
            }
            else{
                r--;
                l++;
            }
        }
        return true;
    }
private:
    bool isPalindrome(string s, int l, int r){
        while(l < r){
            if(s[l++] != s[r--])
                return false;
        }
        return true;
    }
};

Java

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

 

posted @ 2020-02-10 22:27  silentteller  阅读(280)  评论(0编辑  收藏  举报