LCS最長公共子串行

2021-10-01 09:14:21 字數 1811 閱讀 6820

lcs:最長公共子串行,即longest common subsequence,lcs。乙個序列s任意刪除若干個字元得到新序列t,則t叫做s的子串行;兩個序列x和y的公共子串行中,長度最長的那個,定義為x和y的最長公共子串行。

例如:-字串8123681與123685的最長公共子串行為12368

*注意區別最長公共子串(longest common substring),最長公共字串要求連續

*(這裡我們我們只求其中乙個公共子串行,因為lcs可能存在多個子串行)

step1. 可以通過比較尾數字元是否相等。

第一種情況:

s1x=s2y(s1x、s2y分別是s1、s2的最後乙個字串),則s1xs2y最長公共子串行lz的最後乙個字元必定為s1x(或s2y),則可以推出:

2):lcs(s1x,s2y)=lcs(s1x-1,s2y-1)+s1x (或lcs(s1x-1,s2y-1)+s2y)

(如字串fdc與ab

c,我們可以寫作lcs(fdc,abc)=lcs(fd,ab)+」c」)

第二種情況:

s1x≠s2y,因為lz≠s1x,則最長公共子串行lz是由s1x-1和s2y得到,即:lz=lcs(s1x-1,s2y);同理若lz≠s2y,則lz=lcs(s1x,s2y-1);即:若s1x≠s2y,則:lcs(s1x,s2y)=max;

總結step1:(動態規劃問題

step2: 結合打表求lcs

結合「打表」(這裡沒用遞迴+備忘錄,盡量避免使用遞迴,一旦寫錯就會陷入死迴圈)方式,使用二維陣列ta[m,n](演算法中的資料結構:長度陣列ta[i,j]記 錄序列s1x和s2y的最長公共子串行的長度。當i=0或j=0時, 空序列是s1x和s2y的最長公共子串行,故ta[ij]=0。可得以下公式(如圖):

}} //---------------列印二維陣列---------------

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問題。當數列的量為一定的時,都可以採用動態規劃去解決。解法動態規劃的乙個計算最長公共子串...