字符环

总时间限制: 
1000ms
内存限制: 
65536kB
描述

有两个由字符构成的环。请写一个程序,计算这两个字符环上最长连续公共字符串的长度。例如,字符串“ABCEFAGADEGKABUVKLM”的首尾连在一起,构成一个环;字符串“MADJKLUVKL”的首尾连在一起,构成一个另一个环;“UVKLMA”是这两个环的一个连续公共字符串。

输入
一行,包含两个字符串,分别对应一个字符环。这两个字符串之间用单个空格分开。字符串长度不超过255,且不包含空格等空白符。
输出
输出一个整数,表示这两个字符环上最长公共字符串的长度。
样例输入
ABCEFAGADEGKABUVKLM MADJKLUVKL
样例输出
6


#include<stdio.h>
#include<string.h>
int gl,i1,j1,i2,j2,l1,l2,l,suit_l;    //gl为公共子串的长度; 
char s1[256]={0},s2[256]={0},h1[512]={0},h2[512]={0},t[256];
int main()
{
	//freopen("2.cpp","r",stdin);
	scanf("%s %s",s1,s2);
	strcpy(h1,s1);
	strcat(h1,s1);
	h1[strlen(h1)-1]=0;
	strcpy(h2,s2);
	strcat(h2,s2);
	h2[strlen(h2)-1]=0;
	l1=strlen(s1);
	l2=strlen(s2);
	l=(l1>l2?l2:l1);
	l1=strlen(h1);
	l2=strlen(h2);
	for(gl=1;gl<=l;gl++)   
	{
		for(i1=0;i1<=l1-gl;i1++)  //当前母串的起始点 
		{
			for(j1=0;j1<gl;j1++)   //j:子串中的当前位置 
			{
				t[j1]=h1[i1+j1];   //h1+j1:环中当前位置 
			}
			t[j1]=0;
			for(i2=0;i2<=l2-gl;i2++)
			{
				for(j2=0;j2<gl;j2++)
				{
					if(h2[i2+j2]!=t[j2])break;
				}
				if(j2==gl)
				{
					suit_l=gl;
					break;
				}
			}
			if(j2==gl)   //如果找到一个子串即可跳出循环 
			{
				break;
			}
		}
	}
	printf("%d",suit_l);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/yang_2002/article/details/79740550