-
总Time Limit:
- 1000ms Memory Limit:
- 65536kB
-
Description
- 现在有一些由英文字符组成的大小写敏感的字符串,你的任务是找到一个最长的字符串x,使得对于已经给出的字符串中的任意一个y,x或者是y的子串,或者x中的字符反序之后得到的新字符串是y的子串。 Input
- 输入的第一行是一个整数t (1 <= t <= 10),t表示测试数据的数目。对于每一组测试数据,第一行是一个整数n (1 <= n <= 100),表示已经给出n个字符串。接下来n行,每行给出一个长度在1和100之间的字符串。 Output
- 对于每一组测试数据,输出一行,给出题目中要求的字符串x的长度。 Sample Input
-
2
3
ABCD
BCDFF
BRCD
2
rose
orchid
Sample Output
-
2
2
thinking:这题要用到几个字符串函数,但在百炼上貌似不能用revstr,这个只有自己写函数。
1,要从一组字符串中找到最短的一个字符;
2,从这个字符串中遍历找子串,从最长的慢慢到最短的;
3,如果这个子串或反序后是其余字符串的子串,则输出它的长度;
注意:如果没有子串,一定要输出0;
C++语言:ac代码 #include
#include
voidStrrev( char (&x)[ 110], char(&revx)[ 110]) //反序字符串函数;
{
int l;
int i;
l = strlen(x);
for(i= 0; i
{
revx[i] = x[l- 1-i];
}
}
intmain()
{
char str[ 110][ 110]; //储存字符串数组;
int i;
int j;
int k;
int l;
int t;
int n;
scanf( "%d", &t);
while (t--)
{
int flag; //标记是否找到;
char x[ 110] = { 0}; //储存最长子串;
char revx[ 110] = { 0}; //储存最短子串的反序串;
char min_str[ 110] = { 0}; //储存短的字符串;
int min_length = 110; //最短字符串的长度;
scanf( "%d", &n);
for(i= 0; i
{
scanf( "%s", str[i]);
//寻找最短的字符串;
if(strlen(str[i]) < min_length)
{
min_length = strlen(str[i]);
strcpy(min_str, str[i]);
}
}
j= 0;
for(i=min_length; i> 0; i--,j++)
{
for(k= 0; k<=j; k++)
{
strncpy(x, min_str+k, i);
strncpy(revx, min_str+k, i);
revx[i] = x[i] = '\0';
Strrev(x, revx);
flag = 1;
for(l= 0; l
{
if(strstr(str[l], x)==NULL&&strstr(str[l], revx)==NULL)
{
flag = 0;
break;
}
}
if(flag== 1)
{
printf( "%d \n ", i);
break;
}
}
if(flag== 1)
break;
}
if(flag== 0)
printf( "0 \n ");
}
return 0;
}