动态规划算法 求最长公共子序列——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!");
 }
}

原创粉丝点击