首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印最长公共子序列

打印最长公共子序列
EN

Stack Overflow用户
提问于 2014-10-12 14:06:59
回答 1查看 821关注 0票数 2

我所面临的最长的问题是:对于Ex:

代码语言:javascript
复制
“ABCDGH” and “AEDFHR” is “ADH” of length 3

代码:

代码语言:javascript
复制
void lcs( char *X, char *Y, int m, int n )
{
   int L[m+1][n+1];

   /* Following steps build L[m+1][n+1] in bottom up fashion. Note
      that L[i][j] contains length of LCS of X[0..i-1] and Y[0..j-1] */
   for (int i=0; i<=m; i++)
   {
     for (int j=0; j<=n; j++)
     {
       if (i == 0 || j == 0)
         L[i][j] = 0;
       else if (X[i-1] == Y[j-1])
         L[i][j] = L[i-1][j-1] + 1;
       else
         L[i][j] = max(L[i-1][j], L[i][j-1]);
     }
   }

我不明白为什么这一行代码:

代码语言:javascript
复制
L[i][j] = max(L[i-1][j], L[i][j-1]);

如果我想打印序列,也就是ADH,我该怎么做呢?

EN

回答 1

Stack Overflow用户

发布于 2014-10-12 14:23:00

我不明白为什么这一行代码: Li = max(Li-1,Li);

如果X[0..i-1]的最后一个字符与Y[0..j-1]的最后一个字符不匹配,那么对于每个公共子序列,这些字符中至少有一个不属于。因此,给出的答案是X[0..i-2]Y[0..j-1]的最大长度,或X[0..i-1]Y[0..j-2]的最大长度。

为了恢复实际的子序列,我们必须像这样追溯这些决定。

代码语言:javascript
复制
char lcs[min(m, n) + 1];
char *end = lcs;
int i = m;
int j = n;
while (i > 0 && j > 0) {
    if (X[i - 1] == Y[j - 1]) {
        *end = X[i - 1];
        end++;
        i--;
        j--;
    } else if (L[i - 1][j] >= L[i][j - 1]) {
        i--;
    } else {
        j--;
    }
}
reverse(lcs, end);
*end = '\0';
puts(lcs);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26325983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档