最长公共子序列

来源:互联网 发布:网络视听通则 编辑:程序博客网 时间:2024/05/19 17:57
import java.util.Scanner;public class Test{public static void main(String[] args) {Scanner input=new Scanner(System.in);String s1=input.nextLine();String s2=input.nextLine();compare(s1,s2);input.close();}public static void compare(String s1,String s2){int m=s1.length();int n=s2.length();int c[][]=new int[m+1][n+1];int d[][]=new int[m+1][n+1]; //新增数组用来记录c[i][j]前继节点for(int i=0;i<m+1;i++){      //0表示没有  1表示左边c[i][0]=0;               //2表示斜上方,3表示正上方d[i][0]=0;}for(int j=0;j<n+1;j++){c[0][j]=0;d[0][j]=0;}for(int i=1;i<m+1;i++){for(int j=1;j<n+1;j++){if(s1.charAt(i-1)==s2.charAt(j-1)){c[i][j]=c[i-1][j-1]+1;d[i][j]=2;}else{if(c[i-1][j]>c[i][j-1]){d[i][j]=1;c[i][j]=c[i-1][j];}else{d[i][j]=3;c[i][j]=c[i][j-1];}}}}print(s1,d,m,n);}public static void print(String s,int[][] d,int m,int n){if((m==0&&n==0)||d[m][n]==0)return;if(d[m][n]==1){print(s,d,m-1,n);}else if(d[m][n]==3){print(s,d,m,n-1);}else{print(s,d,m-1,n-1);System.out.print(s.charAt(m-1));}}/** * 不用额外开辟空间输出公共子串的方法 * @param c * @param s1 * @param s2 * @param m * @param n *///  public static void fun(int[][] c,String s1,String s2,int m,int n){//  if((m==0&&n==0)||c[m][n]==0)//  {//  return;//  }//  if(s1.charAt(m-1)==s2.charAt(n-1)){//  fun(c,s1,s2,m-1,n-1);//  System.out.print(s1.charAt(m-1));//  }else if(c[m][n]==c[m-1][n]){//  fun(c,s1,s2,m-1,n);//  }else{//  fun(c,s1,s2,m,n-1);//  }//  }}
0 0
原创粉丝点击