2 3 ABCD BCDFF BRCD 2 rose orchid
2 2
算法解析:
在多个字符串中寻找最长字串,并输出该字串的长度。首先找出最短的一个字符串,以最短字符串的所有子串从长到短搜索所有字符串,若全部满足存在某个最短字符串的子串或反转子串,输出该子串的长度。
需要利用的字符串函数
strlen:计算字符串的长度
strncpy:复制字符串的子串
strcpy:复制字符串
strstr:在字符串中寻找子字符串
strrev:对字符串进行反序
代码如下:
#include<stdio.h>
#include<string.h>
char str[100][101];
int n;
int searchMaxSubString(char *source)
{
int i, j, subStrLen,sourceStrLen;
int foundMaxSubStr;
char subStr[101], revSubStr[101];
subStrLen= sourceStrLen=strlen(source) ;
while ( subStrLen > 0 )
{ //搜索不同长度的子串,从最长的子串开始搜索
for (i = 0; i <= sourceStrLen - subStrLen; i++)
{ //搜索长度为subStrLen 的全部子串,共 sourceStrLen – subStrLen个
//取source字符串中第i个字符开始的长度为subStrLend的子串
strncpy(subStr, source+i, subStrLen);
strncpy(revSubStr, source+i, subStrLen);
subStr[subStrLen] = revSubStr[subStrLen] = '\0';
strrev(revSubStr); //得到反序子串
foundMaxSubStr = 1;
for( j = 0; j < n; j++)
if ( strstr(str[j], subStr) == NULL &&
strstr(str[j], revSubStr) == NULL )
{
foundMaxSubStr = 0;
break;
}
if (foundMaxSubStr)
return(subStrLen);
}
subStrLen--;
}
return 0;
}
int main()
{
int N,min,a,x,i;
scanf("%d",&N);
while(N--)
{
scanf("%d",&n);
min=100,i=0;
while(i<n)
{
scanf("%s",str[i]);
a=strlen(str[i]);
if(min>a)
{
min=a;x=i;
}
i++;
}
printf("%d\n",searchMaxSubString(str[x]));
}
return 0;
}hdu 1238 Substrings,布布扣,bubuko.com
原文:http://blog.csdn.net/u014492609/article/details/38487761