LCS最长公共子序列――动态规划
2013-10-18 09:15
387 查看
给定两个字符序列X{x1,x2,x3,...,xm}和Y{y1,y2,...,yn}
设最长公共子序列为Z{z1,z2...zk},那么,以下结论成立: C(i, j)的递推方程如下:
C(x, y) = 0 ,i=0,j=0
= C(i-1 ,j-1)+1i,j>0 , xi = yj
= max{ C(i-1 , j) , C(i , j-1)}i,j>0 , xi!= yj网上的一张图比较清晰地反映寻找过程,其实基本很多算法书都是参考这样的图~~~
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/11/667f915f5d2882976733940fe4183007.jpg)
本文出自 “再累也要开心D” 博客,请务必保留此出处http://zhangzhang.blog.51cto.com/6250085/1310638
设最长公共子序列为Z{z1,z2...zk},那么,以下结论成立: C(i, j)的递推方程如下:
C(x, y) = 0 ,i=0,j=0
= C(i-1 ,j-1)+1i,j>0 , xi = yj
= max{ C(i-1 , j) , C(i , j-1)}i,j>0 , xi!= yj网上的一张图比较清晰地反映寻找过程,其实基本很多算法书都是参考这样的图~~~
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/11/667f915f5d2882976733940fe4183007.jpg)
public static int Length(char [] strX,char[]strY){ final int MAX = 1000; int [][] C = new int[MAX][MAX]; int [][] B = new int[MAX][MAX]; int m = strX.length+1; int n = strY.length+1; for(int i = 0 ; i < m ; i++){ C[i][0] = 0;//初始化第一行 } for(int j = 0 ; j < n ; j++){ C[0][j] = 1;//初始化第一列 } for(int i = 1 ; i < m ; i++){ for(int j = 1 ; j < n ; j++){ //i-1是因为字符数组从第0个字符开始比较 if(strX[i-1]==strY[j-1]){ C[i][j] = C[i-1][j-1]+1; B[i][j] = 1;//C[i][j]从C[i-1][j-1]得到 }else if(C[i-1][j] >= C[i][j-1]){ C[i][j] = C[i-1][j]; B[i][j] = 2;//从C[i-1][j]得到 }else{ C[i][j] = C[i][j-1]; B[i][j] = 3;//从C[i][j-1]得到 } } } return C[m-1][n-1]; } //在实际的算法运行中,可以将B数组删去,可以用C[i-1][j-1]保存B[i][j]的值 public static void PrintCS(int[][]B,char []X, int i, int j){ if(i==0 || j==0) return ; if(B[i][j] == 1){ PrintCS(B,X,i-1,j-1); System.out.print(X[i-1]); }else if(B[i][j] == 2){ PrintCS(B,X,i-1,j); }else{ PrintCS(B,X,i,j-1); } } PrintCS(B,strX,m-1,n-1);//注意m-1和n-1,因为m和n都等于length+1B[i][j]=1,C[i][j]从C[i-1][j-1]得到;B[i][j]=2,从C[i-1][j]得到;B[i][j]=3,从C[i][j-1]得到
本文出自 “再累也要开心D” 博客,请务必保留此出处http://zhangzhang.blog.51cto.com/6250085/1310638
相关文章推荐
- iOS手势UIGestureRecognizer整理
- Android基本功:异步任务(AsyncTask)
- 五大常用算法之二:动态规划算法(DP)
- [MySQL] 存储过程、函数、触发器和视图的权限检查
- Linux下使用select实现超级定时器
- 我伙呆,硅谷高级工程师年薪16.5万美金起
- [z]一个合格的FPGA工程师需要掌握哪些知识?
- OpenStack Havana版发布
- shell脚本强制进程重启
- Oracle用户创建及权限授予
- 海量数据处理面试题
- 分析师称Retina iPad mini将在下周发布 但会遭遇产能尴尬
- Android模拟器无法上网解决方案
- 生活就像个洋葱,一层一层剥开它,总有一层让你流泪
- tomcat启动或,struts2需要加载哪些配置文件,加载顺序
- C# 两个ListBox 数据互传-基础操作
- 【C语言】12-指向一维数组元素的指针
- PowerHA7.1.1 之 CAA继续深入剖析
- 导入Excel出错引出两类异常——数据库异常和业务异常处理方式
- DP的学习