算法问题one——最长公共字串算法问题

博友们好,下面跟大家分享一道我大二上学期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;
}
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值