描述
有两个由字符构成的环。请写一个程序,计算这两个字符环上最长连续公共字符串的长度。例如,字符串“ABCEFAGADEGKABUVKLM”的首尾连在一起,构成一个环;字符串“MADJKLUVKL”的首尾连在一起,构成一个另一个环;“UVKLMA”是这两个环的一个连续公共字符串。
输入
一行,包含两个字符串,分别对应一个字符环。这两个字符串之间用单个空格分开。字符串长度不超过255,且不包含空格等空白符。
输出
输出一个整数,表示这两个字符环上最长公共字符串的长度。
样例输入
ABCEFAGADEGKABUVKLM MADJKLUVKL
样例输出
6
#include<stdio.h>
#include<string.h>
int main()
{
int len_a,len_b,len,i,j,n,sum=0;
char a[256]={0},b[256]={0},c[512]={0},d[512]={0};
scanf("%s %s",a,b);
strcpy(c,a); //将a拷贝给c
strcpy(d,b); //将b拷贝给d
strcat(c,a); //将a接在c后面,形成一个环
strcat(d,b); //将b接在d后面,形成一个环
len_a=strlen(a);
len_b=strlen(b);
len=len_a>len_b?len_b:len_a;
for(i=0;i<len_a;i++)
{
for(j=0;j<len_b;j++)
{
n=0; //记录当前子串长度
//这题n==len时就不需要这两个环比较了,有的题目需要n<2*len,依题目而定
while(c[i+n]==d[j+n]&&n<len) //找到两个相同字母,n++,此时循环条件也会自动转换成后面一个字母的判断,很妙
{
n++;
}
//一轮比较结束后
sum=sum>n?sum:n; //如果比sum大,则此时的n暂为最大长度,赋值给sum
}
}
printf("%d",sum);
return 0;
}