转的:
题意:输入n个字符串,每个字符串的长度最多为100,要求求出这n个字符串的最长公共子串长度。(注意:假设这n个字符的最长公共子串为maxstr,则说每个字符串的的正序或逆序中只要其中一个有maxstr,就说明该字符含有maxstr).
思路:(1)先求这n个字符串中的最小长度字符串minstr.
(2)再枚举公共子串的长度从len(minstr) 到 1,枚举所有可能的公共子串substr,再检查其它n - 1个字符串中的正序或逆序串中是否有substr,如果满足,则返回长度len(substr),否则继续枚举,直到长度为0.
(3)strstr, strncpy函数的应用很重要,大家可上网查相应的用法。
源代码:
#include
<iostream>
//此代码参考了网上资料
using namespace std;
const int MAXN =
101;
char
str[MAXN][MAXN];
void
my_strrev(char
*str)
{
int l, r;
r =
strlen(str);
l = 0; r = r
- 1;
while(l <
r) {
char ch =
str[l];
str[l ++] =
str[r];
str[r --] =
ch;
}
}
int
max_substr(char
*source, int
n)
{
int sublen =
strlen(source);
int sourcelen =
strlen(source);
char substr[MAXN],
resubstr[MAXN];
while(sublen
> 0)
{
for(int i =
0; i <=
sourcelen - sublen; i ++)
{
strncpy(substr, source
+ i, sublen);
strncpy(resubstr, source
+ i, sublen);
substr[sublen] =
'/0';
resubstr[sublen] =
'/0';
my_strrev(resubstr);
bool flag =
true;
for(int j =
0; j <
n; j ++)
if(strstr(str[j],
substr) ==NULL
&&
strstr(str[j],
resubstr) == NULL)
{
flag = false;
break;
}
if(flag)
return(sublen);
}
sublen --;
}
return(0);
}
int main()
{
char minstr[MAXN];
int i, j, n,
minlen, test;
scanf("%d",
&test);
while(test --)
{
scanf("%d",
&n);
getchar();
minlen = 100;
for(i =
0; i <
n; i ++) {
scanf("%s",
str[i]);
if(minlen>strlen(str[i]))
{
minlen =
strlen(str[i]);
strcpy(minstr,
str[i]);
}
}
printf("%d/n",
max_substr(minstr,
n));
}
return(0);