给定两个字符序列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

网上的一张图比较清晰地反映寻找过程,其实基本很多算法书都是参考这样的图~~~

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+1

B[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]得到

转载于:https://blog.51cto.com/zhangzhang/1310638

LCS最长公共子序列——动态规划相关推荐

  1. 算法设计 - LCS 最长公共子序列最长公共子串 LIS 最长递增子序列

    出处 http://segmentfault.com/blog/exploring/ 本章讲解: 1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度: 2. 与之类似但不 ...

  2. 最长公共子序列动态规划c语言,动态规划----最长公共子序列(C++实现)

    最长公共子序列 题目描述:给定两个字符串s1 s2 - sn和t1 t2 - tm .求出这两个字符串的最长公共子序列的长度.字符串s1 s2 - sn的子序列指可以表示为 - { i1 < i ...

  3. LCS最长公共子序列和LIS最长上升子序列——例题剖析

    一.LCS最长公共子序列 最长公共子序列(LCS)问题算法详解+例题(转换成LIS,优化为O(nlogn),看不懂你来打我) longest comment subsequence 模板题 longe ...

  4. LCS(最长公共子序列)及其O(n)空间优化,O(nlogn)时间复杂度优化

    LCS(最长公共子序列)及其O(n)空间优化,O(nlogn)时间复杂度优化 n^2 的版本 int LCS_n_2(vector<char> &a,vector<char& ...

  5. 动态规划求解LCS最长公共子序列问题c++

    文章目录 求最长公共子序列 最长公共子序列问题 刻画最长公共子序列的特征 递归公式 C++代码 求最长公共子序列长度 打印任意一组最长公共子序列 模板题 求最长公共子序列 最长公共子序列问题 (Lon ...

  6. 【ACM】最长公共子序列 - 动态规划

    最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长 ...

  7. C语言(CED)最长公共子序列----动态规划第一题

    一.动态规划算法与分治法的异同 相同点: A.二者均是将待求解的问题分成若干子问题来求解. B.二者在编写代码的时候,都要用到递归. 不同点: A.分治法求解的问题,在将问题分成若干子问题之后,其子问 ...

  8. LCS(最长公共子序列)

    题意描述 求两个字符串的最长公共子序列的长度 动态规划 用二维数组 C[i][j] 记录串x1x2⋯xi与y1y2⋯yj 的 LCS长度,则可得到状态转移方程: 代码实现: #include<i ...

  9. LCS/最长公共子序列/最长公共子串 实现 Python/Java

    参考 http://blog.csdn.net/u012102306/article/details/53184446 http://blog.csdn.net/hrn1216/article/det ...

  10. LCS最长公共子序列(最优线性时间O(n))

    这篇日志主要为了记录这几天的学习成果. 最长公共子序列根据要不要求子序列连续分两种情况. 只考虑两个串的情况,假设两个串长度均为n. 一,子序列不要求连续. (1)动态规划(O(n*n)) (转自:h ...

最新文章

  1. 『中级篇』docker之wordpress容器SSL(番外篇)(78)
  2. 授以渔 - Autodesk Forge 学习简谈 - 引言
  3. PGA内存作用和构成
  4. java url getfile_java url构成及get属性方法解释
  5. 知乎超万赞回答:中国有哪些「无心插柳柳成荫」的事情?
  6. ASP.NET中常用的26个优化性能方法(1-10)
  7. C语言实现一个随机测试加减乘除,编写程序:C语言实现一个随堂测试,能进行加减乘除运算...
  8. 【实战项目】采用jeecg3.2框架,一个人写的购物系统
  9. Vuejs 计算属性
  10. IT网络通信大变革时代来临 2016中国极客大奖为您找到风向标
  11. ireport怎么套打_DNF小小王国历险记巨人击退战怎么打 巨人击退战通关技巧攻略...
  12. 获取springmvc中所有的Controller
  13. 交通部 城轨交通运营管理规定_重庆启动节前轨道交通运营管理安全执法检查...
  14. Hyperledger Fabric chaincode 开发(疑难解答)
  15. 《Arduino实战》——1.7 为代码编写注释
  16. AD09导出光绘文件(Gerber)
  17. python爬取网站大数据_[Python]爬虫抓取大数据职位数据
  18. 优车车欲用Uber模式和传统驾校一起打一场漂亮仗
  19. 阿里云——零基础入门语音识别——食物声音识别——代码跑通及解析
  20. 从十七年蝉谈起——hashtable的表格大小为什么要选择质数

热门文章

  1. 开发者必备的6款源码搜索引擎
  2. MVVM设计模式《网摘》
  3. float在内存中是如何保存的
  4. bzoj 1415: [Noi2005]聪聪和可可
  5. c#中sqlhelper类的编写(一)
  6. C#笔记 使用自定义事件(含参)
  7. 用鼠标获取任意窗口的句柄, 并把它当作干儿子
  8. Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)广播程序的开发
  9. Java爬虫框架Jsoup学习记录
  10. 130242014057 周陈清 实验一