力扣Leetcode 680. 验证回文字符串 Ⅱ

验证回文字符串 Ⅱ

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

示例 1:

输入: "aba"
输出: True

示例 2:

输入: "abca"
输出: True
解释: 你可以删除c字符。

注意:

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

题解

class Solution {
public:
    bool checkPalindrome(const string& s, int low, int high) { // 判断是否为回文
        for (int i = low, j = high; i < j; ++i, --j) {
            if (s[i] != s[j]) {
                return false;
            }
        }
        return true;
    }

    bool validPalindrome(string s) {
        int low = 0, high = s.size() - 1; // low 为左侧 high为右侧 头尾双指针
        while (low < high) { // 跳出条件
            if (s[low] == s[high]) { // 相等则头尾往中间靠近
                ++low;
                --high;
            }
            else { // 不相同时 删除一个可以删左侧 也可以删右侧 所以用递归查找
              // 只要二者有一个满足即可
                return checkPalindrome(s, low, high - 1) || checkPalindrome(s, low + 1, high);
            }
        }
        return true;
    }
};
posted @ 2020-05-19 15:24  CoderZjz  阅读(170)  评论(0编辑  收藏  举报