タイトルの説明
動的プログラミングアルゴリズムを使用して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]);
}
}