【寒江雪】算法导论——最长公共子串
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]=“左边”;
}
}
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]=“左边”;
}
}
相关文章推荐
- 算法导论—最长公共子串
- [算法导论]动态规划---最长公共最序列问题
- 【每天学点算法题10.15】获取两个字符串之间最长公共子串的长度
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 算法: 动态规划解最长公共子串
- 每天一道算法题--最长公共子序列和最长公共子串
- 算法题9 动态规划之最长公共子序列&amp;最长公共子串
- hdu 1159 最长公共子串 O(nm)dp算法
- 最长公共子串的文本比较算法
- lcs.py 最长公共子串算法
- 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列
- 最长公共子串算法
- 【算法设计-最长公共子串与最长公共子序列】
- 程序员面试题精选100题(20)-最长公共子串[算法]
- 求最长公共子串问题的算法分析--《计算机仿真》2007年12期
- 【算法题】最长公共子串
- 算法学习之最长公共子串
- [算法笔记]动态规划之最长公共子串和最长公共子序列
- 实用算法实现-第 8 篇 后缀树和后缀数组 [3 两个字符串的最长公共子串]
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串