给定两个序列,从中找出两个序列的最长公共子系列。
动态规划算法描述:
int CommonOrder(int m, int n, int x[ ], int y[ ], int z[ ])
{
for (j=0; j<=n; j++) //初始化第0行
L[0][j]=0;
for (i=0; j<=m; i++) //初始化第0列
L[i][0]=0;
for (i=1; i<=m; i++)
for (j=1; j<=n; j++)
if (x[i]= =y[j]) { L[i][j]=L[i-1][j-1]+1; S[i][j]=1; }
else if (L[i][j-1]>=L[i-1][j]) { L[i][j]=L[i][j-1]; S[i][j]=2; }
else {L[i][j]=L[i-1][j]; S[i][j]=3; }
i=m; j=n; k=L[m][n];
for (i>0 && j>0)
{
if (S[i][j]= =1) { z[k]=x[i]; k--; i--; j--; }
else if (S[i][j]= =2) j--;
else i--;
}
return L[m][n]; }
LongestCommonSubstring.java //动态规划算法
import java.util.*;
public class LongestCommonSubstring
{
public static void main(String[] args)
{
/**
*从键盘输入两个要求的序列分别存放在X[]和Y[]中
*/
Scanner in=new Scanner(System.in);
System.out.println("Now,please enter string one(请输入序列一):");
String x=in.nextLine();
System.out.println("Now,please enter string two(请输入序列二):");
String y=in.nextLine();
int m=x.length();
int n=y.length();
char[] X=new char[m];
char[] Y=new char[n];
double startTime=System.currentTimeMillis();//starttime
for(int i=0;i<m;i++)
{
X[i]=x.charAt(i);
}
for(int i=0;i<n;i++)
{
Y[i]=y.charAt(i);
}
int[][] L=new int[m+1][n+1];
int[][] S=new int[m+1][n+1];
/**
*初始化长度矩阵L和状态矩阵S的第0行和第0列
*/
int i,j,k;
for(j=0;j<=n;j++)
{
L[0][j]=0;
S[0][j]=0;
}
for(i=0;i<=m;i++)
{
L[i][0]=0;
S[i][0]=0;
}
/**
*根据动态规划函数求解L和S
*/
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
if(X[i-1]==Y[j-1])
{
L[i][j]=L[i-1][j-1]+1;
S[i][j]=1;
}
else if(L[i][j-1]>=L[i-1][j])
{
L[i][j]=L[i][j-1];
S[i][j]=2;
}
else
{
L[i][j]=L[i-1][j];
S[i][j]=3;
}
}
}
/**
*根据状态矩阵求出最长公共子序列Z
*/
i=m;
j=n;
k=L[m][n];
char[] Z=new char[k];
while(i>0&&j>0)
{
if(S[i][j]==1)
{
Z[k-1]=X[i-1];
k--;
i--;
j--;
}
else if(S[i][j]==2)
j--;
else
i--;
}
double endTime=System.currentTimeMillis();//endtime
/**
*打印输出最长公共子序列及其长度,和函数所用时间
*/
String s=String.valueOf(Z);
System.out.println("The longest common substring of X and Y is: "+s+" ,and the longest length is: "+L[m][n]);
System.out.println("Basic Statements take(基本语句用时) "+(endTime-startTime)+" milliseconds!");
}
}
本文介绍了一种使用动态规划求解两个序列最长公共子序列的方法,并通过Java代码实现了该算法。用户可输入两组序列,程序将输出它们的最长公共子序列及长度。

2657

被折叠的 条评论
为什么被折叠?



