用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

南阳oj37回文字符串

2017-04-15 作者: qq188380780举报

[c++]代码库

/*
将字符串逆序,找出原字符串与该字符串的公共子序列,则其余部分为需要添加的字符
状态转移方程参考最长公共子字符串
http://www.cnblogs.com/qq188380780/p/6678471.html
*/
#include<cstdio>
#include<cstring>
#define Max(a,b) ((a)>(b)?(a):(b))
char a[1005],b[1005];
int d[1005][1005];

void solven(int len)
{
    int i,j;
    for(i=1; i<=len; ++i)
    {
        for(j=1; j<=len; ++j)
        {
            if(a[i-1] == b[j-1])
                d[i][j] = d[i-1][j-1] + 1;
            else
                d[i][j] = Max(d[i-1][j],d[i][j-1]);
        }
    }
}

int main()
{
    int t,i,j,len;
    scanf("%d",&t);
    while(t--)
    {
        memset(d,0,sizeof d);
        scanf("%s",a);
        len = strlen(a);
        for(i=0; i<len; ++i)
            b[i] = a[len-1-i];
        solven(len);
        printf("%d\n",len-d[len][len]);
    }
    return 0;
}

//空间优化,与最长公共子序列一样
#include<cstdio>
#include<cstring>

char a[1005],b[1005];
int d[1005];

void solven(int len)
{
    int i,j,t,temp;
    for(i=0; i<len; ++i)
    {
        for(j=t=0; j<len; ++j)
        {
            temp = d[j];
            if(a[i] == b[j])
                d[j] = t + 1;
            else if(d[j] < d[j-1])
                d[j] = d[j-1];
            t = temp;
        }
    }
}

int main()
{
    int t,i,j,len;
    scanf("%d",&t);
    while(t--)
    {
        memset(d,0,sizeof d);
        scanf("%s",a);
        len = strlen(a);
        for(i=0; i<len; ++i)
            b[i] = a[len-1-i];
        solven(len);
        printf("%d\n",len-d[len-1]);
    }
    return 0;
}

//另可不必再开数组存逆序,只需要记录位置即可
#include<cstdio>
#include<cstring>

char a[1005];
int d[1005];

void solven(int len)
{
    int i,j,t,temp;
    for(i=0; i<len; ++i)
    {
        for(j=t=0; j<len; ++j)
        {
            temp = d[j];
            if(a[i] == a[len-1-j])
                d[j] = t + 1;
            else if(d[j] < d[j-1])
                d[j] = d[j-1];
            t = temp;
        }
    }
}

int main()
{
    int t,i,j,len;
    scanf("%d",&t);
    while(t--)
    {
        memset(d,0,sizeof d);
        scanf("%s",a);
        len = strlen(a);
        for(i=0; i<len; ++i)
            b[i] = a[len-1-i];
        solven(len);
        printf("%d\n",len-d[len-1]);
    }
    return 0;
}



网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...