LCS演算法的C 實現

2021-07-07 05:14:41 字數 1346 閱讀 6253

感謝july大神,感謝其團隊的鄒博。

目標一:

實現下圖中的矩陣

首先根據要比較的x,y字串構造二維陣列c,維度是x和y的長度+1,用於記錄最長公共子串行長度

xlen=x.length();

ylen=y.length();

int c[xlen+1][ylen+1];

接著是n陣列,記錄方向,我用0代表左,1代表上,2代表左上

int n[xlen][ylen];//0-left 1-top 2-left-top
對於c陣列,將第0行和第0列賦值為0

for(i=0;i<=xlen;i++)

c[i][0]=0;

for(j=0;j<=ylen;j++)

c[0][j]=0;

然後是乙個二重迴圈,給陣列c和n賦值

c陣列依據的公式是

n[i,j]取值的依據是

如果x(i-1)=y(j-1),那麼n[i,j]=2;

如果x(i-1)!=y(j-1),且c[i-1,j]>=c[i,j-1],那麼n[i,j]=1;

如果x(i-1)!=y(j-1),且c[i-1,j]因此:

for(i=1;i<=xlen;i++)

else}}

到此已經完成了對c,n陣列的賦值。n的最後乙個數就儲存著最長公共子串行的長度

根據n的方向指示,就可以找出最長公共子串行

i=xlen-1;

j=ylen-1;

while(1)

if(n[i][j]==0)

else if(n[i][j]==1)

else

}

鄒博的ppt中給的尋找最長公共子串行的實現用的遞迴。但是我嘗試用單獨的函式實現的時候,發現在用二維陣列作為函式引數上遇到了問題,暫時沒找到更好的辦法,因此就乾脆棄用遞迴,用while迴圈實現。(畢竟都說遞迴效率不高,只能這樣安慰自己了23333)

上面的while迴圈給出的字串s並不是最長公共子串行,而是其反序的結果,因此將其反向輸出就是我們要的結果了

for(i=s.length()-1;i>=0;i--)

cout

演算法 LCS及輸出LCS

最長公共子串行 include using namespace std typedef long long ll char a 1005 b 1005 pos i j 的三個值1,2,3分別表示左 左上和上 pos記錄當前lcs是從哪個點過來的,如果不等於2說明當前值是繼承自上乙個相等的點 所以如果...

LCS 演算法的改進

通常兩個字串的最大公共子串的問題是通過下面的演算法來完成的 把字串1 長度m 橫排,串2 長度n 豎排,得到乙個m n的矩陣c,矩陣的每個元素的值如下,如果m i n j 則c j i 1,否則,c j i 0。然後找出矩陣中連續是1的對角線最長的乙個,則對角線的長度就是公共子串的長度.一看這個方法...

O nlogn LIS及LCS演算法

morestep學長出題,考驗我們,第二題裸題但是資料範圍令人無奈,考試失利之後,刻意去學習了下優化的演算法 一 o nlogn 的lis 最長上公升子串行 設當前已經求出的最長上公升子串行長度為len。先判斷a t 與d len 若a t d len 則將a t 接在d len 後將得到乙個更長的...