题目:
有一些由英文组成的大小写敏感的字符串,找到一个最长的子串,使得对于已经给出的字符串中任意一个串y,x或者是y的子串,或者x中的字符串反序之后得到的新串是y的子串。
输入:
第一行表示测试的组数t
第二行表示字符串的个数n
接下来n行表示字符串
样例:
2
3
ABCD
BCDFF
BRCD
2
rose
orchid
输出
2
2
代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string>
int main() {
char str[100][101], minStr[101], subStr[101], revSubStr[101];
unsigned int i, j, t, m, n, substrlen, found, minlen;
scanf("%d", &t);//测试数据组数
while (t--) {
scanf("%d", &n);
minlen = 101;
for (i = 0; i < n; i++) {//读入所有数据串
scanf("%s", str[i]);
if (strlen(str[i]) < minlen) {//查找最短的字符串
minlen = strlen(str[i]);
m = i;
}
}
strcpy(minStr, str[m]);//查找到最短的串
substrlen = minlen;
while (substrlen > 0) {//取子串长度
for (i = 0; i <= minlen - substrlen; i++) {
strncpy(subStr, minStr + i, substrlen);//取正向子串
subStr[substrlen] = '\0';
strncpy(revSubStr, minStr + i, substrlen);//取逆向子串
revSubStr[substrlen]='\0';
_strrev(revSubStr);
found = 1;
for (j = 0; j < n; j++) {//在所有子串中查找是否包含正或者逆向子串
if (strstr(str[j], subStr) == NULL && strstr(str[j], revSubStr) == NULL) {
found = 0;
break;
}//在str[j]中不存在子串
}
if (found)
break;//找到子串,结束
}
if (found)
break;//找到子串,结束
substrlen--;//没找到子串子串长度减1,再试
}
printf("%d\n", substrlen);//输出找到子串长度
}
getchar();//测试加上,否则可以删除
return 0;
}