最長公共子序列(LCS)

什麼是最長公共子序列
   
      什麼是最長公共子序列呢?舉個簡單的例子吧,一個數列S,若分別是兩個或多個已知序列的子序列,且是所有符合條件序列中最長的,則S稱爲已知序列的最長公共子序列。

  舉例如下,如:有兩個隨機數列,1 2 3 4 5 6 和 3 4 5 8 9,則它們的最長公共子序列便是:3 4 5。
 
最長公共子串和最長公共子序列的區別

     上網查了下,最長公共子串(Longest Common Substirng)和最長公共子序列(Longest Common Subsequence,LCS)的區別爲:子串是串的一個連續的部分,子序列則是從不改變序列的順序,而從序列中去掉任意的元素而獲得新的序列;也就是說,子串中字符的位置必須是連續的,子序列則可以不必連續。最長公共字串,後綴數組能求

動態規劃方法

   1、序列str1和序列str2
 
  長度分別爲m和n;
  創建1個二維數組L[m.n];
  初始化L數組內容爲0
  m和n分別從0開始,m++,n++循環:
     - 如果str1[m] == str2[n],則L[m,n] = L[m - 1, n -1] + 1;
     - 如果str1[m] != str2[n],則L[m,n] = max{L[m,n - 1],L[m - 1, n]}
    最後從L[m,n]中的數字一定是最大的,且這個數字就是最長公共子序列的長度
    從數組L中找出一個最長的公共子序列

   2、從數組L中查找一個最長的公共子序列

   i和j分別從m,n開始,遞減循環直到i = 0,j = 0。其中,m和n分別爲兩個串的長度。
  ·如果str1[i] == str2[j],則將str[i]字符插入到子序列內,i--,j--;
  ·如果str1[i] != str[j],則比較L[i,j-1]與L[i-1,j],L[i,j-1]大,則j--,否則i--;(如果相等,則任選一個)
 
窮舉法(不推薦)

窮舉法是解決最長公共子序列問題最容易想到的方法,即對S的每一個子序列,檢查是否爲T的子序列,從而確定它是否爲S和T的公共子序列,並且選出最長的公共子序列。
 
   S和T的所有子序列都檢查過後即可求出S和T的最長公共子序列。S的一個子序列相應於下標序列1,2,...,n的一個子序列。因此,S共有2^n個子序列。當然,T也有2^m個子序列。

發佈了52 篇原創文章 · 獲贊 10 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章