最長公共子串行 LCS

2021-07-04 11:17:39 字數 1217 閱讀 4959

什麼是最長公共子串行

什麼是最長公共子串行呢?舉個簡單的例子吧,乙個數列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]中的數字一定是最大的,且這個數字就是最長公共子串行的長度

從陣列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個子序列。

LCS 最長公共子串行

問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上 公升的序列 i1,i2,ik 使得對 j 1,2,k,有 xij zj。比如z a,b,f,c 是 x a,b,c,f,b,c 的子串行。現在給出兩個序列 x和 y,你的任務是找到 x和 y的最大公共子...

LCS最長公共子串行

求兩個字串的最大公共子串行問題 子串行的定義 若給定序列x 則另一串行z 是x的子串行是指存在乙個嚴格遞增下標序列使得對於所有j 1,2,k有 zj xij。例如,序列z 是序列x 的子序列,相應的遞增下標序列為。分析 用動態規劃做 1.最長公共子串行的結構 事實上,最長公共子串行問題具有最優子結構...

LCS最長公共子串行

lcs是longest common subsequence的縮寫,即最長公共子串行。乙個序列,如果是兩個或多個已知序列的子串行,且是所有子串行中最長的,則為最長公共子串行。複雜度對於一般的lcs問題,都屬於np問題。當數列的量為一定的時,都可以採用動態規劃去解決。解法動態規劃的乙個計算最長公共子串...