子串
题目描述
现在有一些由英文字符组成的大小写敏感的字符串,你的任务是找到一个最长的字符串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;
}