此题主要掌握常用的字符串处理函数:
strlen: 计算字符串的长
strncpy: 复制字符串的子串
char* strncpy(char* dest, const char * src, size_t n );
将source串的前n个字符复制到destination串中,返回结果与destination相同。
strcpy: 复制整个字符串到另一个字符数组
char* strcpy(char* dest, const char* src);
strstr: 在字符串str1中寻找子字符串str2,如果有返回相应位置的指针,没有返回NULL
char* strstr(char* str1, char* str2);
#include<stdio.h>
#include<string.h>
char s[100][101];
int t,n;
void strRev(char* s,char* b)
{
int len = strlen(s);
for(int i=0;i<len;i++)
b[len-1-i]=s[i];
b[len]='\0'; //加上结束符
}
int searchMax(char* source)
{
int len=strlen(source);
int tlen=len;
char subStr[101],revStr[101];
while(tlen>0) //遍历所有长度的子串,从最长的开始
{
for(int i=0;i<=len-tlen;i++) //遍历所有初始位置
{
strncpy(subStr,source+i,tlen);
strncpy(revStr,source+i,tlen);
subStr[tlen]=revStr[tlen]='\0'; //分割的子串末尾需要加结束符
char revTmp[101];
strRev(revStr,revTmp);
bool flag = true;
for(int j=0;j<n;j++)
{
if(strstr(s[j],subStr)==NULL && strstr(s[j],revTmp)==NULL)
{
flag = false;
break;
}
}
if(flag) return strlen(subStr);
}
tlen--; //注意不能放到while里,不然tlen值变了
}
return 0;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int minlen=100;
int mini = 0;
for(int i=0;i<n;i++)
{
scanf("%s",s[i]);
if(strlen(s[i])<minlen)
{
minlen = strlen(s[i]);
mini = i;
}
}
int num = searchMax(s[mini]);
printf("%d\n",num);
}
return 0;
}