本题思路:选取输入的数个字符串中长度最小的那一个,然后枚举其子串,和子串的反串,然后对比输入的字符串验证结果。
关于这一题一定要记住几个常用的字符串函数:
1. strncpy: strncpy(substr,a+j,i); 这里substr为复制到的字符串,a+j为串头地址,i为要复制的子串长度。
2.strrev: strrev(revsub); 这样就行了,反转之后无需再做多余操作。
3.strstr strstr(char *s1,char *s2) 如果s2是s1的一个子串,返回其在s1中第一次出现的位置,否则返回NULL。
4.strchr(char *s,char c) 如果s中包含字符c,则返回一个s中第一次出现该字符的指针,否则返回NULL。
千万注意strncpy取字串时,需在所取字串末尾加'\0' !
总时间限制:
1000ms
内存限制:
65536kB
描述
现在有一些由英文字符组成的大小写敏感的字符串,你的任务是找到一个最长的字符串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<stdio.h>
#include<string.h>
#include<stdlib.h>
char str[101][101];
int n;
bool flag; //该标志判定是否存在公共
void reverse(char a[101])
{
int length=strlen(a);
char tmp[101];
strcpy(tmp,a);
for(int i=length-1;i>=0;i--)
{
a[length-1-i]=tmp[i];
}
a[length]=0;
}
int judgemin(char a[101])
{
char substr[101],revsub[101];
int minlen=strlen(a);
for(int i=minlen;i>0;i--) //从最长字串开始
{
for(int j=0;j<=minlen-i;j++)
{
strncpy(substr,a+j,i); //a+j为串头,串长为i
strncpy(revsub,a+j,i);
substr[i]=revsub[i]=0; //这一句一定要加,将字符串最后一位置0,否则答案不正确!
reverse(revsub); //revsub=strrev(revsub);是错误形式,不能这么写
flag=true;
for(int k=1;k<=n;k++)
{
if(strstr(str[k],substr)==NULL&&strstr(str[k],revsub)==NULL)
{
flag=false;
break;
}
}
if(flag==true)
return i;
}
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",str[i]);
}
int minlen=101;
char min[101];
for(int i=1;i<=n;i++)
{
int tmp=strlen(str[i]);
if(tmp<minlen)
{
minlen=tmp;
strcpy(min,str[i]);
}
}
int ans=judgemin(min);
printf("%d\n",ans);
}
return 0;
}