感謝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 後將得到乙個更長的...