原文連接:https://www.techiedelight.com/longest-common-subsequence/spa
最長公共子序列 (longest common subsequence, LCS) 問題就是要找到給定兩個字符序列種出現順序相同的最長子序列的問題,或者說經過刪除第一個原始序列中的某些項和刪除第二個原始序列中的某些項而獲得的相同的最長的子序列。element
這個問題不一樣於找公共字符串的問題,由於子序列並不須要佔據原始序列中一片連續的位置。字符串
例以下面的兩個字符序列 X 和 Yget
X: ABCBDABio
Y: DBCABAclass
LCS 的長度是 4programming
LCS 能夠是:BDAB,BCAB 和 BCBA方法
最簡單的作法就是檢查 \(X[1...m]\) 的每一個子序列,看它是否一樣也是 \(Y[1...n]\) 的子序列。因爲 X 的全部可能的子序列有 \(2^{m}\) 個,因此這種解決方法的複雜度是 \(O(n*2^{m})\)。im
LCS 問題有 optimal substructure,這意味着該問題能夠被分解成更小的,簡單的"子問題",而這些問題又能夠繼續分解成更加簡單的子問題,直到最後問題變得平凡。qq
以長度爲 m 的序列 \(X\) 和 長度爲 n 的子序列 \(Y\)爲例,這裏假定它們以相同的元素結尾。
爲了找到它們的 LCS,能夠經過移除最後一個元素來減小每一個序列的長度,而後找到縮短後的序列的 LCS,而後將找到的 LCS 追加移除的元素。因此咱們能夠獲得結論:
\[LCS(X[1..m], Y[1..n]) = LCS(X[1..m-1], Y[1..n-1]) + X[m] \qquad if \; X[m] = Y[n]\]
如今假設這兩個序列結尾的字符並不相同。
那麼 \(X\) 和 \(Y\) 的 LCS 則是 \(LCS(X[1..m-1], Y[1..n])\) 和 \(LCS(X[1..m], Y[1..n-1])\) 中較長的那個。爲了理解這個性質,咱們能夠如下面兩個序列爲例:
X: ABCBDAB (n elements)
Y: BDCABA (m elements)
這兩個序列的 LCS 要麼以 B 結尾(序列 \(X\) 的最後一個字符),要麼不是。
Case 1: