Leetcode-891: Valid Palindrome II

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/roufoo/article/details/80350275

解法1:
双指针,一前一后往中间靠。当发现不相等时,看去掉p1或p2对应的字符后是否为字符串即可。代码比较罗嗦,还可以简化。

#include <iostream>
#include <string>

using namespace std;

bool validPalindrome(string &s) {
    if (s.size()==0) return false;
    bool isVal=true;
    int p1=0, p2=s.size()-1;
    while (p1<p2) {
        if (s[p1]!=s[p2]) {
            if (p1<p2-1) {
                int p3=p1, p4=p2-1;
                while(p3<p4) {
                    if (s[p3]!=s[p4]) isVal=false;
                    p3++; p4--;
                }
                if (isVal) return true;
                p3=p1+1; p4=p2;
                while(p3<p4) {
                    if (s[p3]!=s[p4]) return false;
                    p3++; p4--;
                }
                return true;
            } else
                return true;
        } else {
            p1++; p2--;
        }
    }
    return true;
}

int main()
{
    string s="eeccccbebaeeabebccceea";
    cout<<validPalindrome(s)<<endl;
    string s1="aguokepatgbnvfqmgmlcupuufxoohdfpgjdmysgvhmvffcnqxjjxqncffvmhvgsymdjgpfdhooxfuupuculmgmqfvnbgtapekouga";
    cout<<validPalindrome(s1)<<endl;
    string s2="deeee";
    cout<<validPalindrome(s2)<<endl;
    return 0;
}

解法2:递归。
下面这个解法是网上的,很简单很强大。

 bool validPalindrome(string s) {
        return valid(s, 0, s.length() - 1, 1);
    }

private:
    bool valid(string& s, int i, int j, int d) { // d: num of chars you can delete at most
        return i >= j || (s[i] == s[j] ? valid(s, i + 1, j - 1, d) : d > 0 && (valid(s, i + 1, j, d - 1) || valid(s, i, j - 1, d - 1)));
    }
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页