您的位置:首页 > 其它

【寒江雪】算法导论——最长公共子串

2016-11-17 00:24 197 查看
最长公共子序列问题
 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++)
4000

            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]=“左边”;
}
    

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: