簡體   English   中英

打印最長的公共子序列

[英]Printing Longest Common Subsequence

我在最長子序列中面臨的問題:對於Ex:

“ABCDGH” and “AEDFHR” is “ADH” of length 3

碼:

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]);
     }
   }

我不明白為什么這行代碼:

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

如果我要打印序列,即ADH該怎么辦?

我不明白為什么這行代碼:

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

如果X[0..i-1]的最后一個字符與Y[0..j-1]的最后一個字符不匹配,則對於每個公共子序列,這些字符中的至少一個不屬於該字符。 因此,答案由X[0..i-2]Y[0..j-1]的最大長度或X[0..i-1]Y[0..j-2]的最大長度給出Y[0..j-2]

為了恢復實際的子序列,我們必須像這樣追溯這些決策。

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM