Para encontrar la subsecuencia común más larga de dos secuencias mediante programación dinámica, es necesario construir una subsecuencia común más larga.

Descripción del título

Para utilizar el algoritmo de programación dinámica para encontrar la subsecuencia común más larga de dos secuencias, es necesario construir una subsecuencia común más larga.

De entrada

Cada conjunto de entrada incluye dos líneas, y cada línea incluye una cadena.

Salida

Una subsecuencia común más larga de dos secuencias de caracteres. (La entrada ha asegurado la unicidad de la subsecuencia común más larga)

Copia de entrada de muestra

acdbxx
ccdxx

Copia de salida de muestra

cdxx

Método uno:

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

      
}

Método dos:

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 artículos originales publicados · Me gustaron 65 · Visitantes 7554

Supongo que te gusta

Origin blog.csdn.net/qq_45353823/article/details/105373353
Recomendado
Clasificación