動的計画法によって2つのシーケンスの最長共通サブシーケンスを見つけるには、最長共通サブシーケンスを作成する必要があります。

タイトルの説明

動的プログラミングアルゴリズムを使用して2つのシーケンスの最長共通サブシーケンスを見つけるには、最長共通サブシーケンスを作成する必要があります。

入力

入力の各セットには2行が含まれ、各行には文字列が含まれます。

アウトプット

2つの文字シーケンスの最も長い共通のサブシーケンス。(入力により、最も長い共通サブシーケンスの一意性が保証されました)

入力コピーの例

acdbxx
ccdxx

出力例のコピー

cdxx

方法1:

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);
    	}
    	
    }
    	
  

      
}

方法2:

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