X=<A,B,C,B,D,A,B>
Y=<B,D,C,A,B,A>
那么,<B,C,B,A> 或者 <B,D,A,B>都是LCS.因为,它们都是X的subsequence,也是Y的subsequence。并且,其长度都为4,达到了最大了。而<B,C,A>则是common subsequence,但不是LCS,因为,其长度只有3.
所以,现在的问题是给定X和Y,要你输出LCS的长度为多少。算法复杂度要求是O(mn),m,n分别是字符串X和Y的长度。
即实现函数public static int LCS(String x,String y);下标从1开始,即x和y的x.charAt(0),都是无效值。
/*
* X=<A,B,C,B,D,A,B>
Y=<B,D,C,A,B,A>
那么,<B,C,B,A> 或者 <B,D,A,B>都是LCS.因为,它们都是X的subsequence,也是Y的subsequence。并且,其长度都为4,达到了最大了。
而<B,C,A>则是common subsequence,但不是LCS,因为,其长度只有3.
所以,现在的问题是给定X和Y,要你输出LCS的长度为多少。算法复杂度要求是O(mn),m,n分别是字符串X和Y的长度。
即实现函数public static int LCS(String x,String y);
下标从1开始,即x和y的x.charAt(0),都是无效值。
*/
public class LongestCommonSequence {
static String X = " " + "ABCBDAB";
static String Y = " " + "BDCABA";
private static enum CHOICE{
BOTH, I_LESS,J_LESS
}
public static void main(String[] args) {
LCS(X,Y);
}
public static int LCS(String x,String y){
char[] X = x.toCharArray();
char[] Y = y.toCharArray();
int M = x.length();
int N = y.length();
int[][] L = new int[M][N];
CHOICE[][] choice = new CHOICE[M][N];
for(int i=0;i<M;i++){
L[i][0] = 0;
}
for(int i=0;i<N;i++){
L[0][i] = 0;
}
for(int i=1;i<M;i++){
for(int j=1;j<N;j++){
if(x.charAt(i) == y.charAt(j)){
L[i][j] = L[i-1][j-1] + 1;
choice[i][j] = CHOICE.BOTH;
}
else if(L[i-1][j] > L[i][j-1]){
L[i][j] = L[i-1][j];
choice[i][j] = CHOICE.I_LESS;
}
else{
L[i][j] = L[i][j-1];
choice[i][j] = CHOICE.J_LESS;
}
}
}
System.out.println("Print the whole matrix:");
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
System.out.print(L[i][j] + " ");
}
System.out.println();
}
System.out.println("Print the whole CHOICE matrix:");
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
System.out.print(choice[i][j] + " ");
}
System.out.println();
}
System.out.println("Print one of the LCS");
printOut(x,L,choice,M-1,N-1);/*注意是m-1和n-1*/
return L[M-1][N-1];
}
/*像这样逆序输出的,最好就能想到用递归来实现*/
private static void printOut(
String x,int[][] L,CHOICE[][] b,int m,int n){
if(m==0||n==0){
return ;
}
if(b[m][n]==CHOICE.BOTH){
printOut(x,L,b,m-1,n-1);
System.out.printf("%c", x.charAt(m));
}
else if(b[m][n]==CHOICE.I_LESS){
printOut(x,L,b,m-1,n);
}
else{//b[m][n]为CHOICE.J_LESS
printOut(x,L,b,m,n-1);
}
}
}
分享到:
相关推荐
最长公共子序列(Longest Common Subsequence,简称LCS)是计算机科学中一个经典的问题,主要涉及算法和数据结构领域,特别是在字符串处理、生物信息学和比较编程中有着广泛的应用。LCS问题寻找的是两个序列中长度...
LCS即最长公共子序列,这是求两组中最长公共子序列
最长公共子序列(Longest Common Subsequence,简称LCS)是计算机科学中一种经典的问题,主要出现在序列比对、文本编辑距离等领域。在两个给定的字符串中,LCS是指不考虑字符顺序的最长子串,它同时存在于这两个字符...
最长公共子序列(Longest Common Subsequence,LCS)是计算机科学中一种经典的字符串问题,主要应用于比较两个序列的相似性。在这个C++算法实验中,我们关注的是如何找到两个字符串之间的最长公共子序列,而不仅仅是...
最长公共子序列问题LCS 最长公共子序列问题(Longest Common Subsequence,LCS)是计算机科学中一个经典的问题,它是指给定两个序列X和Y,找出它们的最长公共子序列。该问题具有重要的理论和实际意义,在很多领域都...
**最长公共子序列(Longest Common Subsequence, LCS)算法详解** 在计算机科学中,LCS算法是一个经典的字符串处理问题,用于寻找两个序列的最长子序列,这个子序列不必是连续的,但必须保持原序列的相对顺序。该...
最长公共子序列(lcs)使用动态规划解决采用c++编写
最长公共子序列(Longest Common Subsequence, LCS)是计算机科学中的一种经典问题,主要应用于字符串比较、生物信息学等领域。在本主题中,我们将深入探讨C++编程语言实现LCS算法的细节。 LCS问题的基本概念是找到...
最长公共子序列(Longest Common Subsequence,LCS)是一个经典的计算机科学问题,涉及序列比较和算法设计。在本实验报告中,我们将深入探讨如何利用动态规划方法解决这一问题。 首先,LCS问题旨在找到两个给定序列...
最长公共子序列(Longest Common Subsequence,LCS)是一个经典的计算机科学问题,它涉及到序列比对和字符串处理。在两个或多个序列中,LCS是指没有改变原有顺序的情况下,存在于所有序列中的最长子序列。这个问题在...
实验报告的主题是“算法设计与分析”,关注的是使用动态规划解决最长公共子序列(Longest Common Subsequence, LCS)的问题。动态规划是一种有效的方法,它适用于具有最优子结构和子问题重叠性质的问题。在本实验中...
最长公共子序列(Longest Common Subsequence,简称LCS)问题属于计算机科学领域中的一个重要问题,尤其是在算法设计与分析方面。此问题的核心在于寻找两个序列的最长公共子序列。其中,“子序列”指的是在原序列中...
实现了求最长公共子序列的算法,内容简单易懂,代码也很短
在讨论最长公共子序列(Longest Common Subsequence,简称LCS)问题时,通常会提及两种主要的算法实现方式:一种时间复杂度为O(n^2),另一种则通过优化达到O(nlogn)的时间复杂度。下面我们将详细介绍这两种算法。 *...
在深入解析给定代码之前,我们先来了解一下“最长公共子序列”(Longest Common Subsequence,简称LCS)的基本概念及其在计算机科学中的应用。LCS问题是一种典型的动态规划问题,广泛应用于生物信息学、文本编辑和...
问题的核心是找到两个序列 X 和 Y 的最长公共子序列(LCS),即在删除若干元素后,X 和 Y 都能变成的子序列。例如,序列 {B,C,D,B} 是 {A,B,C,B,D,A,B} 的子序列,通过下标 {2,3,5,7} 显示这种关系。最长公共子序列...