HDOJ 1503 Advanced Fruits(LCS)
题目链接: http://acm.hdu.edu.cn/diy/contest_showproblem.php?pid=1007&cid=37175.
思路:
将两个串,去掉最长公共子序列后,有序的合并在一起。所以这是一个最长公共子串的应用。打印合并子串也是一个难点
import java.util.Scanner;
public class Main {
static char a[],b[];
static int dp[][];
public static void main(String[] args) {
Scanner sr=new Scanner(System.in);
while(sr.hasNext()) {
a=sr.next().toCharArray();
b=sr.next().toCharArray();
int n1=a.length;
int n2=b.length;
dp=new int[n1+1][n2+1];
for(int i=1;i<=n1;i++) {
for(int j=1;j<=n2;j++) {
if(a[i-1]==b[j-1]) {
dp[i][j]=dp[i-1][j-1]+1;
}else {
dp[i][j]=Math.max(dp[i-1][j], dp[i][j-1]); }
}
}
char[] c=new char[n1+n2];
int k=0;
n1--;
n2--;
while(true) {
if(a[n1]==b[n2]) {
c[k++]=a[n1];
n1--;
n2--;
}
else if(dp[n1][n2+1]>dp[n1+1][n2]) {//说明此时b[n2]是公共子串的一部分。所以不急着打印。
c[k++]=a[n1];
n1--;
}else {
c[k++]=b[n2];
n2--;
}
if(n1==-1) {
for(int i=n2;i>=0;i--) {
c[k++]=b[i];
}
break;
}
if(n2==-1) {
for(int i=n1;i>=0;i--) {
c[k++]=a[i];
}
break;
}
}
for(int i=k-1;i>=0;i--) {
System.out.print(c[i]);
}
System.out.println();
}
}
}