最长公共字串 Longest common subsequence problem

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Eric_LH/article/details/83346292

例 最长公共字串 Longest common subsequence problem

问题描述:这个,很。。。显而易见吧,不知道的,。。。看这里 http://en.wikipedia.org/wiki/Longest_common_subsequence_problem

当然这里,我们也是要先找递归的。假设我的两个sequence,一个是X,长度为n;另一个是Y,长度为m。

现在假设我有两个point,一个是i,指在X的最后一个元素上,另一个是j,指在Y的最后一个元素上。我们的递归应该是分三种情况的。

1)如果X[i] == Y[j] 那么LCS(X[i],Y[j]) = LCS(X[i-1],Y[j-1]) + 1

这个很明显,因为发现了一组公共元素,就看剩下的有多少公共元素。

  1. 如果X[i] != Y[j] 那么 LCS(X[i],Y[j]) = max( LCS(X[i-1], Y[j]), LCS(X[i], Y[j-1]) )

这个其实也很容易相同,就是如果发现不同的,就去掉X或Y的最后一个,然后和另一个完整的比较,这样去掉X还是Y的最后一个,就有两种可能,所以就是要找中间max的一个。

  1. 如果 i=0 或者 j=0,就return 0

因为有一个sequence已经完了。

所以递归这里还是比较明显的:

LCS(n,m){

  if m==0 || n==0

    return 0;

  if(X[n] == Y[m])

    return LCS(n-1,m-1)+1;

  else

    return max( LCS(n,m-1), LCS(n-1,m) );

}

现在有了递归,我们就应该能把它写成tabular的DP。

初始化:Table LCS的第一行第一列都设为0。

for i = 1 to m

  for j = 1 to n

    if(X[i]==Y[j])

      LCS[i,j] = LCS[i-1,j-1]+1;

    else

      LCS[i,j] = max(LCS[i,j-1], LCS[i-1,j] );

猜你喜欢

转载自blog.csdn.net/Eric_LH/article/details/83346292
今日推荐