列表

详情


QY23. 平方串

描述

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

输入描述

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

输出描述

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

示例1

输入:

frankfurt

输出:

4

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 364KB, 提交时间: 2019-05-16

#include<stdio.h>
#include<string.h>

int result_num[51][51] = {0};

int max_longstr(char *a,char *b,int n,int m)//a,b分别是两个字符串,需要预先定义result——num
{
    int i = 0,j = 0;
    for(i = 1;i<=n;i++)
    {
        for(j = 1;j<=m;j++)
        {
            if(a[i-1] == b[j-1])
            {
                result_num[i][j] = result_num[i - 1][j - 1] + 1;
            }
            else
            {
                if(result_num[i - 1][j] > result_num[i][j-1])
                {
                    result_num[i][j] = result_num[i - 1][j];
                }
                else
                {
                    result_num[i][j] = result_num[i][j-1];
                }
            }
        }
    }
    return result_num[n][m];
}
int main()
{
    char *a = 0,*b = 0;
    char str[51] = {0},sa[52] = {0},sb[52] = {0};
    int length = 0;
    int i = 0,j = 0,k = 0,temp = 0,result = 0,max = 0;
    //数据输入部分
    scanf("%s",str);
    length = strlen(str);
    
    for(i = 0;i<(length-1);i++)
    {
        strncpy(sa,str,i+1);
        strcpy(sb,&str[i+1]);
        /*if(i == 2)
        printf("*%s**%s*",sa,sb);*/
        max = max_longstr(sa,sb,i+1,length - i);
        if(max > result)
        result = max;
    }
    
    printf("%d\n",result*2);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 372KB, 提交时间: 2020-12-23

#include<stdio.h>
#include<string.h>
 
int result_num[51][51] = {0};
 
int max_longstr(char *a,char *b,int n,int m)//a,b分别是两个字符串,需要预先定义result——num
{
    int i = 0,j = 0;
    for(i = 1;i<=n;i++)
    {
        for(j = 1;j<=m;j++)
        {
            if(a[i-1] == b[j-1])
            {
                result_num[i][j] = result_num[i - 1][j - 1] + 1;
            }
            else
            {
                if(result_num[i - 1][j] > result_num[i][j-1])
                {
                    result_num[i][j] = result_num[i - 1][j];
                }
                else
                {
                    result_num[i][j] = result_num[i][j-1];
                }
            }
        }
    }
    return result_num[n][m];
}
int main()
{
    char *a = 0,*b = 0;
    char str[51] = {0},sa[52] = {0},sb[52] = {0};
    int length = 0;
    int i = 0,j = 0,k = 0,temp = 0,result = 0,max = 0;
    //数据输入部分
    scanf("%s",str);
    length = strlen(str);
     
    for(i = 0;i<(length-1);i++)
    {
        strncpy(sa,str,i+1);
        strcpy(sb,&str[i+1]);
        /*if(i == 2)
        printf("*%s**%s*",sa,sb);*/
        max = max_longstr(sa,sb,i+1,length - i);
        if(max > result)
        result = max;
    }
     
    printf("%d\n",result*2);
    return 0;
}

上一题