最长公共子序列求解:递归与动态规划方法

来源:互联网 发布:淘宝充话费联通 编辑:程序博客网 时间:2024/06/04 00:23

http://www.cnblogs.com/xudong-bupt/archive/2013/03/15/2959039.html


最长公共子序列,是指多个字符串可具有的长度最大的公共的子序列。

(1)递归方法求最长公共子序列的长度

 1)设有字符串a[0...n],b[0...m],下面就是递推公式。

当数组a和b对应位置字符相同时,则直接求解下一个位置;当不同时取两种情况中的较大数值。


#include<stdio.h>#include<string.h>char a[30],b[30];int lena,lenb;int LCS(int,int);  ///两个参数分别表示数组a的下标和数组b的下标int main(){    strcpy(a,"ABCBDAB");    strcpy(b,"BDCABA");    lena=strlen(a);    lenb=strlen(b);    printf("%d\n",LCS(0,0));    return 0;}int LCS(int i,int j){    if(i>=lena || j>=lenb)        return 0;    if(a[i]==b[j])        return 1+LCS(i+1,j+1);    else        return LCS(i+1,j)>LCS(i,j+1)? LCS(i+1,j):LCS(i,j+1);}

用递归的方法优点是编程简单,容易理解。缺点是效率不高,有大量的重复执行递归调用,而且只能求出最大公共子序列的长度,求不出具体的最大公共子序列。

  (2)动态规划求最长公共子序列的长度

    动态规划采用二维数组来标识中间计算结果,避免重复的计算来提高效率。

    1)最长公共子序列的长度的动态规划方程

    设有字符串a[0...n],b[0...m],下面就是递推公式。字符串a对应的是二维数组num的行,字符串b对应的是二维数组num的列。



0 0
原创粉丝点击