关于回文的解体以及解题方法

牛客网网上的一道腾讯的题目,题目如下:给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。

输入描述:

输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.

输出描述:

对于每组数据,输出一个整数,代表最少需要删除的字符个数。

输入例子:
abcda
google

输出例子:
2
2

简单的大脑只能相处简单的解体方法,但是并不能通过所有的测试用例,我的解题。
我发现我根本不能描述清楚我的算法,虽然我也写出来了代码,但是不能明确描述,说明,思路并不是很清晰。对一些比较简单的字符串可以检测的但是对很长的字符串并不能检测。我的有问题的代码如下:

#include<iostream>
#include<string>
using namespace std;
int foundhuiwen(string* s)
{


    int maxN=0;
    for(int j=0;j<s->length();j++)
    {
        //从第一个开始知道结束
        int i=j;
        int N=0;
        int len=s->length()-1;//要从尾部最后的一个开始
        while(len>=i)
        {
            while(s->at(i)!=s->at(len)&&len>i)//如果不一样那么就往前走一个
                --len;
            if(s->at(i)==s->at(len))
            {
                if(i==len)
                    ++N;
                else
                    N=N+2;
            };
            ++i;
            --len;
        }
        if(maxN<N)
            maxN=N;

    }

    return s->length()-maxN;

}
int main()
{
    string ss[2];
    ss[0]="abccdbaefgafghkbxyzw";
    ss[1]="asdfghjkl";
    //cin>>ss[0]>>ss[1];
    for(int i=0;i<2;i++)
    {
        string *s;
        s=&ss[i];
        int count=foundhuiwen(s);
        cout<<count<<endl;
    }
    return 0;
}


``
然后是一个大神写的能够完全在牛客网上通过测试用例的代码:

include

include

#include

using namespace std;

int main() {
string s;
while (cin >> s) {
string temp = s;
reverse(temp.begin(), temp.end());
int n = s.size();
int *p = new int[n*n];

    for (int i = 0;i < n;++i) {
        for (int j = 0;j < n;++j) {
            if (0 == i || 0 == j) {
                if (s[i] == temp[j])
                    p[i*n + j] = 1;
                else
                    p[i*n + j] = (i > 0) ? (p[(i - 1)*n + j]) : (p[i*n + j - 1]);
            }
            else {
                if (s[i] == temp[j]) {
                    p[i*n + j] = p[(i - 1)*n + j - 1] + 1;
                }
                else
                    p[i*n + j] = max(p[(i - 1)*n + j], p[i*n + j - 1]);
            }
        }
    }
    cout << (n - p[n*n - 1]) << endl;

    delete[] p;
}


return 0;

}

“`
学海无涯,小白仍须努力啊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值