最长对称子串

L2-008 最长对称子串

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。

输入格式:

输入在一行中给出长度不超过1000的非空字符串。

输出格式:

在一行中输出最长对称子串的长度。

题目链接


 动规

复制代码
#include<bits/stdc++.h>
using namespace std;
char a[1010],b[1010];
int l,dp[1010][1010];
int LCS(char *s1,char *s2)
{
    for(int i=1;i<l;i++)
    for(int j=1;j<l;j++)
    {
        if(s1[i]==s2[j])
        dp[i][j]=dp[i-1][j-1]+1;
        else
        dp[i][j]=max(dp[i][j-1],dp[i-1][j]);//因为这里,所以前面ij不能为0。遇到不对劲的地方记得打印输出看看 
    }
    return dp[l-1][l-1];
}
int main()
{
    cin.getline(a,1010);
    l=strlen(a);
    for(int i=0;i<l;i++)
    {
        b[l-i-1]=a[i];
    }
    printf("%d",LCS(a,b));
    return 0;
}
复制代码

本来以为和密码脱落一样,结果只能过一个。

分析了一下:

密码脱落是最长公共子序列的题

这道题是最长对称子串

最长公共子序列是

B  D  C   A   B   A  和  A  B  C  B  D  A  B

最长对称子串是

B  D  C   A   B   A          

所以正确代码如下

 

复制代码
#include<bits/stdc++.h>
using namespace std;
char a[1010];
int maxlen,len;
int main()
{
    cin.getline(a,1010);
    int l=strlen(a);
    for(int i=0;i<l;i++)
    {
        len=1;//奇数情况下
        for(int j=1;j<l;j++)
        {
            if(i+j>=l||i-j<0||a[i+j]!=a[i-j])
            break;
            len+=2;
        } 
        maxlen= max(len,maxlen);
        len=0;//偶数情况下
        for(int j=1;j<l;j++)
        {
            if(i+j>=l||i-j+1<0||a[i+j]!=a[i-j+1])
            break;
            len+=2;
        } 
        maxlen= max(len,maxlen);
    }
    cout<<maxlen;
    return 0;
}
复制代码

 

 还有字符串算法kmp啊,还没学会捏。

这道题还有马拉车算法,应该用不到,先记在这。


密码脱落

X星球的考古学家发现了一批古代留下来的密码。

这些密码是由A、B、C、D 四种植物的种子串成的序列。

仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。  ABA  ABBA   A由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。你的任务是:

给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。

输入一行,表示现在看到的密码串(长度不大于1000)

要求输出一个正整数,表示至少脱落了多少个种子。

例如,输入:

ABCBA

则程序应该输出:

0

再例如,输入:

ABDCDCBABC

则程序应该输出:

3


 

复制代码
#include<bits/stdc++.h>
using namespace std;
int dp[1010][1010];
string a1;
string a2;
int LCS(string s1,string s2)
{
    for(int i=1;i<=s1.size();i++)
    for(int j=1;j<=s2.size();j++)
    {
        if(s1[i]==s2[j])
        dp[i][j]=dp[i-1][j-1]+1;
        else
        dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
    }
    return dp[s1.size()][s2.size()];
}
int main()
{
    cin>>a1;
    a2=a1;
    reverse(a2.begin(),a2.end());
    printf("%d",a1.size()-LCS(a1,a2));
    return 0;
}
复制代码

 string 的stl还是得再看一眼。

posted @   椿の花少年  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示