动态规划求两个序列的最长公共子序列,需构造一条最长公共子序列。

题目描述

使用动态规划算法求两个序列的最长公共子序列,需构造一条最长公共子序列。

输入

每组输入包括两行,每行包括一个字符串。

输出

两个字符序列的一条最长公共子序列。(输入已确保最长公共子序列的唯一性)

样例输入 Copy

acdbxx
ccdxx

样例输出 Copy

cdxx

方法一:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Stack;  
  
public class Main {  

 static char []a=new char[500];
 static char []b=new char[500];
    public static void main(String[] args) {  
        Scanner cin = new Scanner(System.in);  
        while(cin.hasNext()) {
        String str1=cin.next();
        String str2=cin.next();
        a=str1.toCharArray();
        b=str2.toCharArray();
        int n1=a.length;
        int n2=b.length;
        int dp[][]=new int[n1+1][n2+1];
        int drection[][]=new int[n1+1][n2+1];//记录方向
        for(int i=0;i<=n1;i++) {
        	drection[i][0]=0;
        	
        }
        for(int i=0;i<=n2;i++) {
        	drection[0][i]=0;
        	
        }
        int i,j;
        for(i=1;i<=n1;i++)
        {
            for(j=1;j<=n2;j++)
            {
                if(a[i-1]==b[j-1])   ///注意这里的下标是i-1与j-1
                {
                    dp[i][j]=dp[i-1][j-1]+1;
                    drection[i][j]=1;  ///斜向下标记
                }
                else if(dp[i][j-1]>dp[i-1][j])
                {
                	dp[i][j]=dp[i][j-1];
                	drection[i][j]=2;  ///向右标记
                }
                else
                {
                	dp[i][j]=dp[i-1][j];
                	drection[i][j]=3;  ///向下标记
                }
            }
        }
        printlcs(n1,n2,a,drection);
        
        
        
        }
        }
    public static void printlcs(int i,int j, char[]a,int [][]drection) {
    	if(i==0||j==0)return;
    	if(drection[i][j]==1) {
    		printlcs(i-1,j-1,a,drection);
    		System.out.print(a[i-1]);
    	}
    	else if(drection[i][j]==2) {
    		printlcs(i,j-1,a,drection);
    	}else {
    		printlcs(i-1,j,a,drection);
    	}
    	
    }
    	
  

      
}

方法二:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Stack;  
   
public class Main {  
 
 static char []a=new char[500];
 static char []b=new char[500];
    public static void main(String[] args) {  
        Scanner cin = new Scanner(System.in);  
        while(cin.hasNext()) {
        String str1=cin.next();
        String str2=cin.next();
        a=str1.toCharArray();
        b=str2.toCharArray();
        int n1=a.length;
        int n2=b.length;
        int dp[][]=new int[n1+1][n2+1];
        int drection[][]=new int[n1+1][n2+1];//记录方向
        for(int i=0;i<=n1;i++) {
            drection[i][0]=0;
             
        }
        for(int i=0;i<=n2;i++) {
            drection[0][i]=0;
             
        }
        int i,j;
        for(i=1;i<=n1;i++)
        {
            for(j=1;j<=n2;j++)
            {
                if(a[i-1]==b[j-1])   
                {
                    dp[i][j]=dp[i-1][j-1]+1;
                    drection[i][j]=1;  ///斜向下标记
                }
                else if(dp[i][j-1]>dp[i-1][j])
                {
                    dp[i][j]=dp[i][j-1];
                    drection[i][j]=2;  ///向右标记
                }
                else
                {
                    dp[i][j]=dp[i-1][j];
                    drection[i][j]=3;  ///向下标记
                }
            }
        }
        printlcs(n1,n2,drection);
         
         
         
        }
        }
    public static void printlcs(int i,int j,int [][]drection) {
        int k=0;
        char arr[]=new char[500];
        while(i>0 && j>0)
        {
            if(drection[i][j]==1)   ///斜向下标记
            {
                arr[k]=a[i-1];
                k++;
                i--;
                j--;
            }
            else if(drection[i][j]==2)  ///斜向右标记
                j--;
            else if(drection[i][j]==3)  ///斜向下标记
                i--;
        }
        for(i=k-1;i>=0;i--)
           System.out.print(arr[i]);
             
    }
   
 
       
}

发布了81 篇原创文章 · 获赞 65 · 访问量 7554

猜你喜欢

转载自blog.csdn.net/qq_45353823/article/details/105373353