最長公共子序列(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的一個子序列相應於下標序列1,2,...,n的一個子序列。因此,S共有2^n個子序列。當然,T也有2^m個子序列。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.