此题主要掌握常用的字符串处理函数:
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; }