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