/**
* 引进一个二维数组c[][],用c[i][j]记录X[i]与Y[j] 的LCS 的长度,
* b[i][j]记录c[i][j]是通过哪一个子问题的值求得的,以决定搜索的方向。
* 我们是自底向上进行递推计算,那么在计算c[i,j]之前,c[i-1][j-1],c[i-1][j]与c[i][j-1]均已计算出来。
* 此时我们根据X[i] = Y[j]还是X[i] != Y[j],就可以计算出c[i][j]。
*/
public class LCSProblem
{
public static void main(String[] args)
{
String[] x = {"","a" , "b" , "c" , "b" , "d" , "a" , "b","q","w"};
String[] y = {"","b" , "d" , "c" , "a" , "b" , "a"};
int[][] b = getLength(x, y);
Display(b, x, x.length-1, y.length-1);
}
public static int[][] getLength(String[] x, String[] y)
{
int[][] b = new int[x.length][y.length]; //记录c[i][j]是通过哪一个子问题的值求得的
int[][] c = new int[x.length][y.length]; //记录X[i]与Y[j] 的LCS 的长度
for(int i = 0; i < x.length; i++)
c[i][0] = 0;
for(int j = 1; j < y.length; j++)
c[0][j] = 0;
for(int i=1; i<x.length; i++)
{
for(int j=1; j<y.length; j++)
{
if( x[i] == y[j])
{
c[i][j] = c[i-1][j-1] + 1;
b[i][j] = 1;
}
else if(c[i-1][j] >= c[i][j-1])
{
c[i][j] = c[i-1][j];
b[i][j] = 0;
}
else
{
c[i][j] = c[i][j-1];
b[i][j] = -1;
}
}
}
return b;
}
public static void Display(int[][] b, String[] x, int i, int j)
{
if(i == 0 || j == 0)
return;
if(b[i][j] == 1)
{
Display(b, x, i-1, j-1);
System.out.print(x[i] + " ");
}
else if(b[i][j] == 0)
{
Display(b, x, i-1, j);
}
else if(b[i][j] == -1)
{
Display(b, x, i, j-1);
}
}
}
分享到:
相关推荐
动态规划算法求最长公共子序列 动态规划算法是一种常用的算法思想,它通过将复杂的问题分解成多个小问题,并将这些小问题的解组合起来,来解决复杂的问题。在这里,我们使用动态规划算法来求解最长公共子序列问题。...
### C++实现最长公共子序列算法详解 在深入解析给定代码之前,我们先来了解一下“最长公共子序列”(Longest Common Subsequence,简称LCS)的基本概念及其在计算机科学中的应用。LCS问题是一种典型的动态规划问题...
最长公共子序列(Longest Common ...总之,求最长公共子序列是一个典型的动态规划问题,它涉及到序列比较、状态转移和记忆化等概念。理解并掌握这一问题有助于深入理解动态规划思想,并能应用于实际的编程挑战中。
实现了求最长公共子序列的算法,内容简单易懂,代码也很短
在这个问题中,我们要找到两个字符串(序列)的最长公共子序列(Longest Common Subsequence, LCS)。最长公共子序列是指两个序列中存在的一段序列,它既出现在第一个序列中,也出现在第二个序列中,但不考虑元素的...
最长公共子序列(Longest Common Subsequence,LCS)是一个经典的计算机科学问题,涉及序列比较和算法设计。在本实验报告中,我们将深入探讨如何利用动态规划方法解决这一问题。 首先,LCS问题旨在找到两个给定序列...
C语言求最长公共子序列问题的算法实现。LCS问题,没有太多的描述语言了,这个资源很简单的。
3. **结果获取**:最后,`dp[1-flag][m]`即为所求的最长公共子序列的长度。 **示例**: 假设`S1 = {a, b, c, d, e}`和`S2 = {b, d, a, a, a}`。 - 初始化:`dp[0][j] = 0`。 - 遍历: - `i = 1`时(`a`):`dp...
动态规划中的最长公共子...此外,还提供了一些补充习题,例如 X={B, C, A, D} Y={C, A, B, D},求 X 与 Y 的最长公共子序列,并画出数组 c 和 b。这些习题可以帮助读者更好地理解最长公共子序列问题和动态规划算法。
动态规划法求解最长公共子序列问题与0-1背包问题 本实验报告旨在通过动态规划法解决最长公共子序列问题和0-1背包问题,以深入理解动态规划方法的思想、求解策略及步骤。 实验目的 * 理解动态规划方法的核心思想和...
最长公共子序列问题是一个经典的计算机科学问题,主要应用于序列比对、生物信息学等领域。它的目标是找到两个字符串之间的最长序列,这个序列是两个原始字符串的子序列,并且在两个字符串中都存在,但不一定连续。 ...
【问题描述】使用动态规划算法解最长公共子序列问题,具体来说就是,依据其递归式自底向上的方式依次计算得到每个子问题的最优值。 【输入形式】在屏幕上输入两个序列X和Y,序列各元素数间都以一个空格分隔。 ...
在计算机科学领域,求解最长公共子序列(Longest Common Subsequence,简称LCS)问题一直是一个热点研究话题。LCS指的是两个序列共有的子序列中长度最长的一个。这个问题不仅在理论上有重要的意义,还在实际应用中...
最长公共子序列(Longest Common Subsequence,LCS)是一个经典的计算机科学问题,它涉及到序列比对和字符串处理。在两个或多个序列中,LCS是指没有改变原有顺序的情况下,存在于所有序列中的最长子序列。这个问题在...
哈工大算法实验二,最长公共子序列问题,动态规划解决LCS 1.实现基于优化子结构的递归求解算法 2.实现基于动态规划的求解算法 3.实现三个字符串最长公共子序列的动态规划算法 4.有界面源代码和实验报告!均为自己所...
用动态规划求最长公共子序列: 问题:求给定两个序列的最长公共子序列,要求输入两个序列,输出它们的最长公共子序列及其长度值。
### 最长公共子序列问题详解 #### 一、问题定义及背景 最长公共子序列(Longest Common Subsequence,简称LCS)问题属于计算机科学领域中的一个重要问题,尤其是在算法设计与分析方面。此问题的核心在于寻找两个...
分步讲解 最长公共子序列求法 1在Excel中找到规律 2规律总结到程序中 3根据规律找到长度 4找到长度的规律 5长度对应的值及对应的公共子序列 这个算法可以应用到文字录入测试的应用中,测试文字录入内容,常用的...