实现最长公共子序列的算法,java两个字符串的最长公共子序列

  实现最长公共子序列的算法,java两个字符串的最长公共子序列

  如何解决写爬虫IP受阻的问题?立即使用。

  实验目的:

  输入两个同类型的序列,通过动态规划计算它们的最长公共子序列及其序列的长度。

  (推荐教程:java视频教程)

  想法:

  1.首先,使用一个二维数组存储最长公共子序列的长度,并记录每个值的状态。

  2.根据记录值的状态,递归回溯最长公共子序列。

  3.递归方程:

  代码实现:

  封装最长公共子序列;

  导入Java . util . scanner;

  /**

  * @作者德拉科

  * @查看最长公共子序列()

  * @版本

  * @日期-时间2020-04-27-下午4:23:36

  */

  公共类LCS {

  公共静态void main(String[] args) {

  //测试字符串:ABCBDAB BDCABA

  Scanner scanner=新扫描仪(system . in);

  System.out.println(注意:第一个字符串比第二个字符串长);

  System.out.print(请输入第一个字符串:);

  string string 1=scanner . next();

  System.out.print(请输入第二个字符串:);

  string string 2=scanner . next();

  String str1=string1

  String str2=string2

  //String str 1= ABCBDAB ;

  //String str 2= BD caba ;

  int[][]c=getSubstringMatrix(str 1,str 2);

  String[][] b=getTrace(str1,str 2);

  system . out . println( length matrix:);

  展示(c);

  system . out . println();

  System.out.println(方向矩阵:);

  showForString(b);

  System.out.println(最长公共子序列的长度: C[str 1 . Length()][str 2 . Length()]);

  string sMax=str 1 . length()str 2 . length()?str 1:str 2;//选择最长的字符串,因为要取出最大的子串。

  string sMin=str 1 . length()str 2 . length()?str 1:str 2;//选择最小的字符串

  System.out.print(最长公共子串:);

  print(b,sMax,sMax.length(),smin . length());

  }

  /**

  * @参见找出子序列矩阵,其中最后一行和最后一列是最长子序列的长度。

  * @param x首个字符串

  * @param y第二字符串

  * @返回长度矩阵

  */

  public static int[][]getSubstringMatrix(String x,String y) {

  int xLen=x . length()1;//加1,因为第一次初始化是0。

  int yLen=y . length()1;

  int rLen=xLen yLen?xLen:yLen;//大型字符串作为行放置

  int cLen=xLen yLen?xLen:yLen;//小字符串放在列中

  int[][]c=new int[rLen][cLen];//矩阵C保存状态

  for(int I=1;i rLeni ) {

  for(int j=1;j克伦;j ) {

  if(x . charat(I-1)==y . charat(j-1)){

  //相等,由对角线1表示

  c[I][j]=c[I-1][j-1]1;

  } else if (c[i - 1][j]=c[i][j - 1]) {

  //不相等,选择较大的那个

  c[I][j]=c[I-1][j];

  }否则{

  c[I][j]=c[I][j-1];

  }

  }

  }

  返回c;//长度矩阵

  }

  /**

  * @see记录每个值的状态,方便回溯和递归。

  * @param x首个字符串

  * @param y第二字符串

  * @返回方向矩阵

  */

  public static String[][]getTrace(String x,String y) {

  int xLen=x . length()1;

  int yLen=y . length()1;

  //为矩阵C和b设置行和列。

  int rLen=xLen yLen?xLen:yLen;//大型字符串作为行放置

  int cLen=xLen yLen?xLen:yLen;//小字符串放在列中

  int[][]c=new int[rLen][cLen];

  String[][] b=新字符串[rLen][cLen];

  for(int I=1;i rLeni ) {

  for(int j=1;j克伦;j ) {

  if(x . charat(I-1)==y . charat(J-1)){//等于

  c[I][j]=c[I-1][j-1]1;

  b[I][j]= \ \ \ \ ;//指向左上角

  } else if(C[I-1][J]=C[I][J-1]){//不等于

  //当上述值较大时

  c[I][j]=c[I-1][j];

  b[I][j]= ;//指向顶部

  }否则{

  //当下列值很大时

  c[I][j]=c[I][j-1];

  b[I][j]= —— ;//指向左边

  }

  }

  }

  返回b;//方向矩阵

  }

  /**

  * @see递归实现回溯,然后打印出最长的公共子序列。

  * @param b方向矩阵

  * @param的长字符串

  * @param i较长字符串的长度

  * @param j较短字符串的长度

  */

  public static void print(String[][]b,String s,int i,int j) {

  //递归终止的条件

  if (i==0 j==0) {

  返回;

  }

  //判断递归的条件。

  if (b[i][j]。等于( \ \ \ \ ){

  //遇到斜杠时递归到左上角

  打印(b,s,i - 1,j-1);

  系统。出去。print(s . charat(I-1) );

  } else if (b[i][j].等于( ){

  //遇到竖线,递归到上边

  print(b,s,i - 1,j);

  } else if (b[i][j].等于( —— ){

  //遇到横线,递归到左边

  print(b,s,I,j-1);

  }

  }

  /**

  * @见打印二维数组

  * @param b一个二维数组

  */

  public static void show(int[][]b){

  for(int w=0;w。长度;w ) {

  for(int p=0;p b[w].长度;p ) {

  系统。出去。print(b[w][p] \ \ t );

  if (p==b[w].长度- 1) {

  系统。出去。println();

  }

  }

  }

  }

  /**

  * @见打印字符串的二维数组

  * @param b一个字符串的二位数组

  */

  public static void showForString(String[][]b){

  for(int w=1;w。长度;w ) {

  系统。出去。打印( \ \ t );

  for(int p=1;p b[w].长度;p ) {

  系统。出去。print(b[w][p] \ \ t );

  if (p==b[w].长度- 1) {

  系统。出去。println();

  }

  }

  }

  }

  }运行结果:

  相关推荐:java入门以上就是算法学习——java实现最长公共子序列的详细内容,更多请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: