LCS 算法

LCS算法:
寻找俩字符串的最大公共子串
俩个数组a[str1长+1][str2长+1],   b[str1长+1][str2长+1]

       a记录LCS值  b记录值从哪来的

数组第一行,第一列都初始化为0,其他根据计算而来
字符串相等时,a[i][j]=左上角值+1      b[i][j]记为1  是由左上角而来,所以回溯时 向左上角走  
           不等时:上面的比左面的大      a[i][j]=上面的值,b[i][j]=2 
                                  下面的比上面的大        a[i][j]=下面的值,b[i][j]=3 
   
    根据b输出结果
        i=str1长    j=str2长
                如果   b[i][j]=1   根据左上角来  递归调用i--;j--,输出cout<<str1[i-1];
                            b[i][j]=2    递归i-1;
b[i][j]=3    递归 j-1;


void LCS_print(const char *s1,const char *s2)
{
	if(s1==NULL||s2==NULL)
		return ;
	int l1=0,l2=0;

	l1=strlen(s1)+1;
	
	l2=strlen(s2)+1;
	
	if(l1==0||l2==0)
		return 0;
	
	
	int i,j;
	int **a=new int [l1+1];
	int **b=new int [l1+1];
	
	//初始化
	for(i=0;i
   
   
    
    =a[i][j-1])
				{
					a[i][j]=a[i-1][j];
					b[i][j]=2;
				}
				else
				{
					a[i][j]=a[i][j-1];
					b[i][j]=3;
				}
			}
		}
	}

   LCS(l1-1,l2-1,b,s1,s2);
   int lcs=a[l1-1][l2-1];
   
   //释放空间
   for(i=0;i
    
    
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值