最长子串

题目描述

现在有一些由英文字符组成的字符串,你的任务是找到一个最长的字符串x,使得对于已经给出的字符串中的任意一个y,x或者是y的子串,或者x中的字符反序之后得到的新字符串是y的子串。(不区分大小写)

输入的第一行是一个整数t (1 <= t <= 10),t表示测试数据的数目。对于每一组测试数据,第一行是一个整数n (1 <= n <= 100),表示已经给出n个字符串。接下来n行,每行给出一个长度在1和100之间的字符串。

对于每一组测试数据,输出一行,给出题目中要求的字符串x的长度。

Sample Input

2

3

ABCD

BCDFF

BRCD

2

Rose

Orchid

Sample Output

2

2

代码

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

int main()
{
    char str[100][101],minstr[101],substr[101],revsubstr[101];
    unsigned int i,j,k,t,m,n,substrlen,found,minlen;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        minlen=101;
        for(i=0;i<n;i++)
        {
            scanf("%s",str[i]);
            for(k=0;str[i][k]!='\0';k++)
                if(str[i][k]>='A' && str[i][k]<='Z')
                    str[i][k]+=32;
            if(strlen(str[i])<minlen)
            {
                minlen=strlen(str[i]);
                m=i;
            }    
        }
        strcpy(minstr,str[m]);
        substrlen=minlen;
        while(substrlen>0)
        {
            for(i=0;i<=minlen-substrlen;i++)
            {
                strncpy(substr,minstr+i,substrlen);
                substr[substrlen]='\0';
                strncpy(revsubstr,minstr+i,substrlen);
                revsubstr[substrlen]='\0';
                strrev(revsubstr);
                found=1;
                for(j=0;j<n;j++)
                {
                    if(strstr(str[j],substr)==NULL && strstr(str[j],revsubstr)==NULL)
                    {
                        found=0;
                        break;
                    }
                }
                if(found)
                    break;
            }
            if(found)
                break;
            substrlen--;
        }
        printf("%d\n",substrlen);
    }
    return 0;
}
/* bottom:40px 距浏览器底部距离 right:40px 距浏览器右边距离 */