leetcode 680 验证回文字符串II (贪心)

题目描述:

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

题解:

  在允许最多删除一个字符的情况下,同样可以使用双指针,通过贪心算法实现。初始化两个指针$low$ 和 $high$ 分别指向字符串的第一个字符和最后一个字符。每次判断两个指针指向的字符是否相同,如果相同,则更新指针,令 $low = low + 1$ 和 $high = high - 1$,然后判断更新后的指针范围内的子串是否是回文字符串。如果两个指针指向的字符不同,则两个字符中必须有一个被删除,此时我们就分成两种情况:即删除左指针对应的字符,留下子串 $s[low + 1], s[low + 1], ..., s[high]$,或者删除右指针对应的字符,留下子串 $s[low], s[low + 1], ..., s[high - 1]$。当这两个子串中至少有一个是回文串时,就说明原始字符串删除一个字符之后就以成为回文串。代码如下:

class Solution {
public:

    bool isPa(string s,int l,int r)
    {
        while(l < r)
        {
            if(s[l] != s[r]) return false;
            l++;
            r--;
        }
        return true;
    }
    bool validPalindrome(string s) {
        int len = s.size();
        int l = 0;
        int r = len-1;
        while(l < r)
        {
            if(s[l] == s[r]) 
            {
                l++;
                r--;
            }
            else return isPa(s,l+1,r) || isPa(s,l,r-1);
        }
        return true;
    }
};

 

posted @ 2020-05-20 16:59  猪突猛进!!!  阅读(139)  评论(0编辑  收藏  举报