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