输入一个字符串,定义一个条件,长度是偶数的子串,并且这个子串的前半部分和后半部分完全相同,求满足条件的子串的最长长度,字符串的最长长度不会超过1000,保证全是小写英文字母
2
abbab
aaaabbbbbb
2
6
#include<stdio.h>
#include<string.h>//strlen 函数头文件
#include<stdbool.h>//bool变量头文件
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
char s[1010];
scanf("%s",s);
int len=strlen(s);
bool flag=false;
int i=0,j=0,k=0;
for(i=len/2;i>0;i--)//题目要求的是最长的子串
//子串的长度要求是2n,满足要求的子串的前半部分和后半部分相等
{//i枚举的是答案的一半,并且是从大往小进行枚举的(求最大值,找到符合条件的直接结束循环)
for(j=0;j+2*i<=len;j++)
{//j枚举的是满足条件的子串的起点,从满足条件的子串的第一个元素开始
flag=true;//假设子串是满足条件的
for(k=j;k<i+j;k++)
{//k枚举的是满足条件的子串的前半部分
if(s[k]!=s[k+i])//i表示的是满足条件子串的长度的一半
//也就是子串前半部分的长度
{
flag=false;
break;
}
}
if(flag==true) break;//因为是答案i从最大值开始枚举的,所以找到了一个满足条件的子串
//跳出循环即可
}
if(flag==true) break;
//因为是答案i从最大值开始枚举的,所以找到了一个满足条件的子串
//跳出循环即可
}
if(flag==true) printf("%d\n",i*2);
else printf("0\n");
}
return 0;
}
我最开始以为是求拥有最长相等元素的子串长度,根据样例瞎猜的题意,满足两个样例,还以为是哪里超时了之类的,结果是WA,蒙了很久
我们就思考可能的最大的最大值是多少,最大的最大值是整个字符串长度(假设字符串长度是偶数的话),把一个子串分成两个部分,前半部分等于后半部分,直接把字符串长度除以2 ,系统自动向下取整,答案是除以二再乘以2
准确的来说是寻找符合条件的子串,我们需要从第一个元素开始遍历,每一个元素都可以作为子串的起点,但是可以做一个优化,就是起点加上答案的值小于字符串的总长度
根据3说的起点,判断子串前半部分的元素是否完全等于后半部分,如果有一对元素不相等,就结束循环,表示不满足条件,一旦找到符合条件的子串,该字串的长度就是我们要求的答案,就像前面说的,从最大值开始寻找,找到的第一个答案,就是我们要求的答案