动态规划算法 求最长公共子序列——Java 实现
来源:互联网 发布:网络缓存级别 编辑:程序博客网 时间:2024/06/16 17:25
给定两个序列,从中找出两个序列的最长公共子系列。
动态规划算法描述:
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 实现
- 动态规划算法——最长公共子序列问题(java实现)
- 算法实践-求最长公共子序列-动态规划
- 动态规划算法——最长公共子序列求法
- 动态规划求最长公共子序列
- 【动态规划】求最长公共子序列
- 动态规划:求最长公共子序列
- 求最长公共子序列(动态规划)
- java版 动态规划求最长公共子序列
- 动态规划——最长公共子序列(JAVA)
- 算法学习心得——动态规划法实现最长公共子序列(LCS)
- 《算法导论》动态规划—最长公共子序列(不连续)--c语言实现
- 动态规划实现最长公共子序列(LCS)算法
- 【算法】 动态规划 最长公共子序列
- (基于Java)算法之动态规划——最长公共子序列
- java动态规划算法--最长公共子序列问题
- 动态规划实现最长公共子序列
- 动态规划实现最长公共子序列
- Powershell记录2
- 一段累计计算与折行并用的SQL
- Collection List Set Map 区别记忆
- PL SQL中复制出的中文乱码
- 更改Ribbon默认字体大小
- 动态规划算法 求最长公共子序列——Java 实现
- rdl
- C#垃圾回收Finalize 和Dispose的理解
- “Cannot start ECMT Manager”错误的处理
- 基于LINUX操作系统的防火墙技术及其具体实现
- 软件侵权案 谁在暗战?谁遭遇了暗算?
- 获得文件锁
- C++面试题:循环数列问题
- 最近发现 java抓取不到baidu首页源代码