最长公共子序列


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);
//	  }
//  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值