1. 程式人生 > >【寒江雪】演算法導論——最長公共子串

【寒江雪】演算法導論——最長公共子串

最長公共子序列問題

 C[i][j]表示字串x<1,2,3,…i>與字串y<1,2,3,…j>的最長公共子序列的長度

初始化

C[0][0]=0;

如果x[i]==y[j]       則c[i][j]=c[i-1][j-1]+1;

否則c[i][j]=max(c[i-1][j],c[i][j-1]);

假設有字符集x<1,2,3,4,5,…m>,y<1,2,3,4,5…n>,Z<1,2,3,4,5,…k>

如果有xm==yn,則zk=xm=yn意味著Zk-1是x和y的一個LCS

如果有xm!=yn,則zk!=xm意味著Z是xm-1和yn的一個LCS

如果有xm!=yn則zk!=yn意味著Z是xm和yn-1的一個LCS

證明:

1.     如果zk!=xm,那麼可以將xm=yn追加到Z的末尾得到X和Y的一個長度為k+1的公共子序列,與Z是X和Y的LCS矛盾。因此必然有zk=xm=yn。這樣字首Zk-1是Xm-1和Yn-1的一個長度為k-1的公共子序列(也就是說,把xm和yn以及zk都去掉後,剩下的字串Zk-1與Xm-1和Yn-1,Zk-1即為Xm-1和Yn-1的一個公共子序列),我們希望證明它是一個LCS。利用反證法,假設存在Xm-1和Yn-1的一個長度大於k-1的一個公共子序列W,則將xm和ym追加到W的末尾會得到X和Y的一個長度大於k的LCS

2.     如果xm!=yn,那麼Z是Xm-1和Yn的一個公共子序列。如果存在Xm-1和Y的一個長度大於k的公共子序列W,那麼Z是Xm-1和Yn的公共子序列,與Z是X和Y的最長公共子序列的假設矛盾。

3.     證明與2對稱

程式碼實現:

For(int i=1;i<=n;i++)

            For(int j=1;j<=n;j++){

                   If(x[i]==y[j]){

       C[i][j]=c[i-1][j-1]+1;

       B[i][j]=“左上角”;

}elseif(c[i-1][j]>=c[i][j-1]){

       C[i][j]=c[i-1][j];

       B[i][j]=“上邊”;

}else{

       C[i][j]=c[i][j-1];

       B[i][j]=“左邊”;

}

}