【转】最长公共子序列(LCS),求LCS长度和打印输出LCS
2017-08-16 20:09
281 查看
求LCS的长度,Java版本:
推导过程和递推公式:
主要参考:
算法导论-----最长公共子序列LCS(动态规划)
其中,理解递推公式之后,要理解代码中的c数组 是怎么变化的(结合下面这个图的过程,过程为:每一行,从左到右)
该文章中,打印LCS的过程(C语言,包括递归和非递归版本)也容易看懂。
Java版本可以参考:最长公共子串、最长公共子序列的Java实现与NLP应用
但打印这一部分看得不太懂:
不如看上一篇C语言的打印,递归和非递归都很清楚
public static int LCS(int[]a,int[] b) { int [][]c=new int[a.length+1][b.length+1]; for(int i=1;i<=a.length;i++) { for(int j=1;j<=b.length;j++) { if(a[i-1]==b[j-1]) c[i][j]=c[i-1][j-1]+1; else c[i][j]=Math.max(c[i-1][j], c[i][j-1]); } } return c[a.length][b.length]; }
推导过程和递推公式:
主要参考:
算法导论-----最长公共子序列LCS(动态规划)
其中,理解递推公式之后,要理解代码中的c数组 是怎么变化的(结合下面这个图的过程,过程为:每一行,从左到右)
该文章中,打印LCS的过程(C语言,包括递归和非递归版本)也容易看懂。
Java版本可以参考:最长公共子串、最长公共子序列的Java实现与NLP应用
但打印这一部分看得不太懂:
int i = 0, j = 0; while (i < substringLength1 && j < substringLength2) { if (str1[i] == str2[j]) { System.out.print(str1[i]); i++; j++; } else if (opt[i + 1][j] >= opt[i][j + 1]) i++; else j++; } System.out.println();
不如看上一篇C语言的打印,递归和非递归都很清楚
相关文章推荐
- 最长公共子序列 LCS 【长度及打印】
- C语言 编写一个程序,从标准输入读取几行输入。每行输入都要打印到标准输出上,前面加上行号。在编写这个程序的时候要使这个程序能够处理的输入行的长度没有限制
- LCS(求出最长公共子序列长度)
- 51nod 1006 最长公共子序列Lcs(打印路径)
- LCS—记录,回溯输出最长公共子序列
- 51nod1006 最长公共子序列Lcs--打表+输出
- 最长公共子序列 (LCS) 学习小记 Hdu 1159 + Poj 2250 (LCS路径打印)
- p16.2编写一个程序,从标准输入读取几行输入,每行输入都要打印到标准输出上,前面要加上行号,书入行的长度没有限制
- LightOJ 1110 - An Easy LCS(最长公共子序列 路径输出 三维 模板啊)
- 动态规划解最长公共子序列(LCS)问题 (附可打印LCS完整代码)
- C/C++学习之C提高-----非空格的字符串长度、去掉字符串前后空格、字符串反转、键值对字符串、const练习、二级指针做输入/输出的特性、将字符串按逗号分开,并放入二维数组打印出来
- 51Nod 1006 最长公共子序列Lcs (输出)
- 从标准输入读取几行输入。每行输入都要打印到标准输出上,前面加上行号。在编写这个程序的时候要使用让这个程序能够处理的输入行的长度没有限制。
- 从标准输入读取几行输入。每行输入都要打印到标准输出上,前面加上行号,使能够处理的输入行的长度没有限制
- 从一个字符串中找出最长连续子字符串,输出其长度、下标并打印出来
- 从标准输入读取几行输入。每行输入都要打印到标准输出上,前面加上行号,使能够处理的输入行的长度没有限制
- 【C语言】从标准输入读取几行输入,每行输入都要打印到标准输出上,前面加上行号,并使此程序能够处理的输入行的长度没有限制。
- 提示用户输入信息,并将用户输入的写入一个文件,当用户输入的信息 是quit的时候,打印输出用户输入的总长度
- 最长公共子序列(求出长度并且输出子序列)
- 【C语言】编写一个程序,从标准输入读取几行输入。每行输入都要打印到标准输出上,前面加上行号。编写这个程序的时候要使这个程序能够处理的输入行的长度没有限制。