Ray-56/like-algorithms

✅680. 验证回文字符串 Ⅱ

Opened this issue · 2 comments

680. 验证回文字符串Ⅱ

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

示例 1:

输入: "aba"
输出: True

示例 2:

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

注意:

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

/**
 * @param {string} s
 * @return {boolean}
 */
var validPalindrome = function (s) {
    function isPalindrome(left, right) {
        while (left < right) {
            if (s[left] !== s[right]) return false;
            left++;
            right--;
        }
        return true;
    }
    let left = 0,
        right = s.length - 1;
    while (left < right) {
        if (s[left] !== s[right]) {
            return (
                isPalindrome(left + 1, right) || isPalindrome(left, right - 1)
            );
        }
        left++;
        right--;
    }
    return true;
};

双指针解

加了如果不相等时,左指针前移判断与右指针后移判断(题目中的最多删除一位)

/**
 * @param {string} s
 * @return {boolean}
 */
var validPalindrome = function(s) {
    let left = 0;
    let right = s.length - 1;
    while (left < right) {
        if (s[left] !== s[right]) {
            return h(left + 1, right, s) || h(left, right - 1, s);
        }
        left++;
        right--;
    }
    return true;
};
var h = function(left, right, s) {
    while (left < right) {
        if (s[left] !== s[right]) return false;
        left++;
        right--;
    }
    return true;
}