题目样例

示例 1

输入

"aba"

输出

True

解释

本身就是回文

示例 2

输入

"abca"

输出

True

解释

可以删除 b 或者 c 字符

题目思考

解决方案

方案 1

思路

复杂度

代码

Python 3
class Solution:
    def validPalindrome(self, s: str) -> bool:
        def check(b, e, canDelete):
            if b >= e:
                return True
            if s[b] == s[e]:
                return check(b + 1, e - 1, canDelete)
            elif canDelete:
                # 还有一次删除机会, 左指针右移或者右指针左移, 同时更新flag保证之后的判断不能再删除字符了
                return check(b + 1, e, Falseor check(b, e - 1False)
            else:
                # 遇到不相等的字符且不能再删除了, 直接返回false
                return False

        return check(0, len(s) - 1True)
C++
class Solution {
public:
    bool validPalindrome(string s) {
        function<bool(intintbool)> check = [&](int b, int e, bool canDelete) {
            while (b < e && s[b] == s[e]) {
                ++b;
                --e;
            }

            if (b >= e) {
                return true;
            }

            if (!canDelete) {
                return false;
            }

            return check(b + 1, e, false) || check(b, e - 1false);
        };

        return check(0, s.size() - 1true);
    }
};

方案 2

思路

复杂度

代码

Python 3
class Solution:
    def validPalindrome(self, s: str) -> bool:
        b = 0
        e = len(s) - 1

        def isPalindrome(b, e):
            while b < e:
                if s[b] == s[e]:
                    b += 1
                    e -= 1
                else:
                    return False
            return True

        while b < e:
            if s[b] == s[e]:
                b += 1
                e -= 1
            else:
                return isPalindrome(b + 1, e) or isPalindrome(b, e - 1)
        return True
C++
class Solution {
public:
    bool validPalindrome(string s) {
        auto isPalindrome = [&](int b, int e) {
            for(; b < e; ++b, --e) {
                if (s[b] != s[e]) {
                    return false;
                }
            }
            return true;
        };

        int b = 0;
        int e = s.size() - 1;

        while (b < e && s[b] == s[e]) {
            ++b;
            --e;
        }

        if (b >= e) {
            return true;
        }

        return isPalindrome(b + 1, e) || isPalindrome(b, e - 1);
    }
};

方案 3

思路

复杂度


参考资料


本文分享自微信公众号 - 每日精选算法题(DailyAlgorithm)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

09-04 18:56