最长公共子序列的长度 Length of Longest common subsequence

34 篇文章 0 订阅

求最长最长公共子序列的长度的时间复杂度为O(m*n),空间复杂度同样为O(m*n)

算法简介:

       首先初始化一个n*n的二维数组m[a.size()][b.size()]全为0

       然后写一个二重循环逐个计算二维数组中的值。

主要利用一下递推关系:

       if(a[i] == b[i])

             m[i + 1][j + 1] = m[i][j] + 1

       else

             m[i + 1][j + 1] = MAX(m[i + 1][j], m[i][j + 1]

模块化实现函数源代码如下:

int lcsLength(string a,string b)
{
      int **m;
      int i,j;
      
      m=new int*[a.size()+1];
      
      for(i=0;i<a.size()+1;i++)
           m[i]=new int[b.size()+1];
      for(i=0;i<=a.size();i++)
           for(j=0;j<=b.size();j++)
                 m[i][j]=0;
                 
      for(i=0;i<a.size();i++)
      {
           for(j=0;j<b.size();j++)
           {
                 if(a[i]==b[j])
                      m[i+1][j+1]=m[i][j]+1;
                 else if(m[i+1][j]>m[i][j+1])
                      m[i+1][j+1]=m[i+1][j];
                 else
                      m[i+1][j+1]=m[i][j+1];
           }
      }
      return m[a.size()][b.size()];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值