子串

题目描述

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

输入

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

输出

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

样例输入

2
3
ABCD
BCDFF
BRCD
2
rose
orchid

样例输出

2
2


#include <cstdio>
#include <string.h>
 
int n;
char sstr[102][102] = {0};
bool flag;
 
int hanshu(char str[102]);
 
int main()
{
    int t, len = 102, lenth, s = 102, r;
    char minlen[102];
    scanf("%d", &t);
    while (t--)
    {
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            scanf("%s", sstr[i]);
            lenth = strlen(sstr[i]);
            if (lenth < len)
            {
                len = lenth;
                s = i;
            }
        }
        strcpy(minlen, sstr[s]);
        r = hanshu(minlen);
        if(r != 0)
            printf("%d\n", r);
    }
    return 0;
}
 
int hanshu(char str[102])
{
    int len = strlen(str);
    char ftstr[102], bdstr[102];
    for (int i = 0; i < len; i++)
    {
        for (int j = 0; j < i + 1; j++)
        {
            flag = true;
            //正序
            for (int k = j, t = 0; k < len - i + j; k++, t++)
            {
                ftstr[t] = str[k];
                ftstr[t + 1] = '\0';
            }
            //printf("%s\n", ftstr);
            //逆序
            for (int k = len - i + j - 1, t = 0; k >= j; k--, t++)
            {
                bdstr[t] = str[k];
                bdstr[t + 1] = '\0';
            }
            //printf("%s\n", bdstr);
            for (int o = 0; o < n; o++)
            {
                if (strstr(sstr[o], ftstr) == NULL && strstr(sstr[o], bdstr) == NULL)
                {
                    flag = false;
                    break;
                }
            }
            if (flag == true)
                return (len - i);
        }
    }
    return 0;
}
posted @ 2019-11-08 20:45  君若绥年  阅读(231)  评论(0编辑  收藏  举报