题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1238
首先将给定的字符串按照长度进行排列;
枚举最短的字符串;
对枚举的每个字符串在其它字符串中进行查找,查看是否是其它字符串的子串;
统计符合条件的字符串的长度,选取最大的长度.
PS:不仅要比较子串,还要比较子串的反串.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char str[101][101],tmp[101],rtmp[101];
int n,t;
int cmp(const void *a,const void *b)
{
return strlen((char*)a) - strlen((char*)b);
}
//枚举字符串
void copy(char *st,int left,int right)
{
int i = 0,h,k;
while(left<=right)
{
tmp[i] = st[left];
i++,left++;
}
tmp[i]='\0';
k = 0;
for(h=i-1;h>=0;h--)
{
rtmp[k]=tmp[h];k++;
}
rtmp[k]='\0';
}
int main()
{
int i,k,h;
int max,flag;
while(~scanf("%d",&n))
{
while(n--)
{
scanf("%d\n",&t);
for(i=0;i<t;i++)
scanf("%s",str[i]);
qsort(str,t,sizeof(str[0]),cmp);
max=0;
for(i=0;i<(int)strlen(str[0]);i++)
{
for(k=i;k<(int)strlen(str[0]);k++)
{
copy(str[0],i,k);
flag = 1;
for(h=1;h<t;h++)
{
if(strstr(str[h],tmp) == NULL&&NULL == strstr(str[h],rtmp))
{
flag=0;break;
}
}
if(flag)max=max>(int)strlen(tmp)?max:(int)strlen(tmp);
}
}
printf("%d\n",max);
}
}
return 0;
}