爱奇艺 平方串 动态规划

题目描述

如果一个字符串S是由两个字符串T连接而成,即S = T + T, 我们就称S叫做平方串,例如"","aabaab","xxxx"都是平方串.
牛牛现在有一个字符串s,请你帮助牛牛从s中移除尽量少的字符,让剩下的字符串是一个平方串。换句话说,就是找出s的最长子序列并且这个子序列构成一个平方串。

输入描述:

输入一个字符串s,字符串长度length(1 ≤ length ≤ 50),字符串只包括小写字符。

输出描述:

输出一个正整数,即满足要求的平方串的长度。

示例1

输入

frankfurt

输出

4
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1e2+5;
int dp[maxn][maxn];
int main()
{
    string s;
    string s1;
    string s2;
    while(cin>>s)
    {
        int len = s.length();
        int ans=0;    
        for(int k=1;k<len;++k)
        {
            s1=s.substr(0,k);
            s2=s.substr(k,len-k);
            //cout<<s1<<"   "<<s2<<endl;
            int len1 = s1.length();
            int len2 = s2.length();
            memset(dp,0,sizeof(dp));
            int i,j;
            for(i=1;i<=len1;++i)
            {
                for(j=1;j<=len2;++j)
                {
                    if(s1[i-1]==s2[j-1])
                    {
                        dp[i][j]=dp[i-1][j-1]+1;
                    }else 
                    {
                        dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                    }
                }                
            }
            //cout<<dp[i-1][j-1]<<endl;
            ans=ans>dp[i-1][j-1]?ans:dp[i-1][j-1];        
        }
        cout<<ans*2<<endl;
    }
    return 0;
}
Last modification:January 12th, 2020 at 12:16 am
如果觉得我的文章对你有用,请随意赞赏