博友们好,下面跟大家分享一道我大二上学期acm实习期间做的最长公共字串的算法题,这道最长公共字串和平常的公共字串算法题不一样,这道题还要输出最长的公共字串具体是什么,那么请看原题:
假设有两个字符串(可能包含空格),找出其中最长的公共连续子串,并输出其长 度。
输入描述:
输入为两行字符串(可能包含空格),长度均小于等于50
输出描述:
输出为一个整数,表示最长公共连续子串的长度
输入例子:
abcde
abgde
输出例子:
2
ab
de
算法思想:这题我做的思想就是定义两个比较打的数组,用来存放两串字符串比较之后的一些数据,为什么要定义这么大呢,因为我们输入的两串字符串长度小于等于50,而我们每存一个数据在数组内就换下一行数组元素继续存,简而言之,就是用比较暴力也比较笨的思想算出来的,然后根据数组内的信息进行对比,从而输出最长的公共字串个数以及所包含的字符。采用了函数模块化思想以及递归调用的思想,我采用的是c写的,代码量比较大,也请想学的朋友认真看看,如果有什么问题或者有更优化的算法可以给我留言,一起探讨!
#include<stdio.h>
int a[3000]={0},n3=0;
int dw=0;//dw,n3为全局变量
char b[3000][50]={0};//初始化b的二维数组,用来存放相同并且连续的字符
int digui(char s1[],int w1,char s2[],int w2,int ds,int n2)//w1=n3+1,w2=i+1
{
if(w2<n2)
{
if(s1[w1]==s2[w2])
{
b[dw][ds++]=s2[w2];
digui(s1,w1+1,s2,w2+1,ds,n2);
}
else {
dw++;//dw表示b数组每一行都存有相同且连续的字符,比较结束的时候,dw++,下一行开始存储另外相同的字符(第二个if)
return 0;
}
}
else {
dw++;//dw表示b数组每一行都存有相同且连续的字符,比较结束的时候,dw++,下一行开始存储另外相同的字符(第一个if)
return 0;
}
}
int xunhuan(char s1[],int n1,char s2[],int n2,int n)//定义hunhuan函数,s1,s2为字符串,n1,n2,为其对应的大小,n为形参,实参为n3的全局变量
{
int i=0,ds=0;
if(n3<n1)
{
for(i;i<n2;i++)
{
if(s1[n3]==s2[i])
{
b[dw][ds++]=s2[i];
digui(s1,n3+1,s2,i+1,ds,n2);//n3+1,i+1为判断相同字符后面的连续字符是否相同
ds=0;
}
}
xunhuan(s1,n1,s2,n2,n3++);//n3为计量第一个去比较的字符串的位置
}
else return 0;
}
int qwq(char b[3000][50])
{
int i,j,count=0;
for(j=0;j<3000;j++)
{
for(i=0;i<50;i++)//判断这一行有多少字符
if(b[j][i]!=0)
count+=1;
a[j]=count;//把这一行的字符赋值给数组a
count=0;
}
count=a[0];
for(i=1;i<3000;i++)//比较字符数最多的量
{
if(a[i]>count)
count=a[i];
}
printf("%d\n",count);//输出字符数最多的量
for(i=0;i<3000;i++)
{
if(a[i]==count)//判断a数组有多少个与count相等的量,输出它们
{
for(j=0;j<50;j++)
if(b[i][j]!=0)//输出除了0以外的字符
printf("%c",b[i][j]);
printf("\n");
}
}
return 0;
}
int main()
{
int count=0,i=0,j=0;
char s1[50],s2[50],c;
c=getchar();//字符串s1的输入
while(c!='\n')
{
s1[i]=c;
i++;
c=getchar();
}
c=getchar();//字符串s2的输入
while(c!='\n')
{
s2[j]=c;
j++;
c=getchar();
}
xunhuan(s1,i,s2,j,0);//调用函数
qwq(b);//调用函数
return 0;
}