问题描述
有一些由英文字符组成的大小写敏感的字符串。请写一个程序,找到一个最长的字符串x,
使得:对于已经给出的字符串中的任意一个y,x或者是y的子串、或者x中的字符反序之
后得到的新字符串是y的子串。
输入:输入的第一行是一个整数t (1 <= t <= 10),t表示测试数据的数目。对于每一组测试
数据,第一行是一个整数n (1 <= n <= 100),表示已经给出n个字符串。接下来n行,每行
给出一个长度在1和100之间的字符串。
输出:对于每一组测试数据,输出一行,给出题目中要求的字符串x的长度;如果找不到
符合要求的字符串,则输出0。
输入样例
2
3
ABCD
BCDFF
BRCD
2
rose
orchid
输出样例
2
2
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
char str[100][101],n;
int searchMaxSubString(int min){//min(即为字符串长度最小的下标)
/*
strlen:计算字符串的长度
strncpy:复制字符串的子串
strcpy:复制字符串
strstr:在字符串中寻找子字符串
strrev:对字符串进行反序
*/
char source[101],strMin[101],agStrMin[101];
int i,j,sourceLen,strMinLen,findMin ;
strcpy(source,str[min]);
strcpy(strMin,str[min]);
sourceLen = strlen(source);
strMinLen = strlen(source);
while(strMinLen > 0){
for(i = 0;i <= (sourceLen - strMinLen);i++){
findMin = 1;
strncpy(strMin,source+i,strMinLen);
strncpy(agStrMin,source+i,strMinLen);
strMin[strMinLen] = '\0';
agStrMin[strMinLen] ='\0';
strrev(agStrMin);
for(j = 0;j < n;j++){
if(strstr(str[j],strMin) == NULL && strstr(str[j], agStrMin) == NULL){
findMin = 0;
break;
}
}
if(findMin){
return strMinLen;
}
}
strMinLen--;
}
return 0;
}
int main()
{
int t,i,minStr,subStrLen;
char min;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
minStr = 100;
for(i = 0;i < n;i++){
scanf("%s",str[i]);
if(strlen(str[i]) < minStr)//在输入数据时候,就将字符最短的找出来,记录下最短字符串的下标(min)
{
minStr = strlen(str[i]);
min = i;
}
}
subStrLen = searchMaxSubString(min);//搜索满足条件的最长字符串
printf("%d\n",subStrLen);
}
return 0;
}
/*
代码分析:本题最大的难点应该是子串的寻找与子串和字符串的对比。有题意很容易想到子串最好先在最短的字符串里寻找。
而要找的是满足题意的最长的子串,所以在最短字符串里寻找满足题意的最长子串时,应对最短字符串一一解剖,从最大-〉
最小。而这些的操作都用了头文件中已给的函数,但是代码的设计却决定了代码长度。刚开始我设计的非常的冗长,看了源
代码后,我发现源代码设计的非常巧妙,几乎每个变量都是不可去的。
*/