LeetCode 680.验证回文字符串II

题目

给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。

示例

输入: "aba"
输出: True

注意:

  1. 字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。

题目链接

题目分析

其实这道题目想通了就不难。首先来看怎么判断一个字符串是不是回文字符串,用双指针法,从左右两端开始遍历,如果一直相同,则说明是回文串。

while (l < r) {
    if (s[l] != s[r]) return false;
    l++;
    r--;
}
return true;

借助判断回文串的方式,我们同样用双指针遍历给定的字符串,如果遇到不相等的左右值,则分别判断(s, l + 1, r) 和 (s, l, r - 1),如果两个中有一个是回文串,则说明可以通过删掉一个字符的方式使原字符串变成回文串。

while (l < r) {
    if (s[l] != s[r]) {
        return isDup(s, l - 1, r) || isDup(s, l, r - 1);
    }
    l++;
    r--;
}
return true;

题目解答

class Solution {
public:
    bool isDup(string s, int l, int r){
        if (l == r) return true;
        while (l < r) {
            if (s[l] == s[r]) {
                l++;
                r--;
            }
            else return false;
        }
        return true;
    }
    bool validPalindrome(string s) {
        int len = s.length();
        if (len == 0 || len == 1) return true;
        int left = 0;
        int right = len - 1;
        while (left < right) {
            if (s[left] == s[right]) {
                left++;
                right--;
            }else {
                return isDup(s, left + 1, right) || isDup(s, left, right - 1);
            }
        }
        return true;
    }
};

你可能感兴趣的:(LeetCode 680.验证回文字符串II)