要找到LCS,可以使用一个二维数组来记录每一格的结果,是由哪一格而来,从最后一个结果往回追溯,如果发现了某个maxlen[i][j]是由maxlen[i-1][j-1]+1而得到的,便可知这个时候的str1[i],str2[j]是使LCS增长的元素,此时输出str1[i-1]或者str2[j-1]即可。而如果要输出LCS的字母表顺序,先把LCS存在一个数组中,再进行字母表排序,最后输出即可。
在这里,我用1代表是由左上元素而来,2代表由上方元素而来,3代表由左方元素而来。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int Max=1000;
char str1[Max+10];
char str2[Max+10];
char str[Max+10];
int p[Max+10][Max+10];
int maxlen[Max+10][Max+10];
int cnt=0;
void print(int i,int j){
if(i==0||j==0){
cnt=0;
return;
}
else if(p[i][j]==1){
print(i-1,j-1);
str[cnt++]=str1[i-1];
}
else if(p[i][j]==2)
print(i-1,j);
else if(p[i][j]==3)
print(i,j-1);
}
int main(){
while(gets(str1)){
gets(str2);
int l1=strlen(str1);
int l2=strlen(str2);
for(int i=0;i<=l1;i++)
maxlen[i][0]=0;
for(int i=0;i<=l2;i++)
maxlen[0][i]=0;
for(int i=1;i<=l1;i++){
for(int j=1;j<=l2;j++){
if(str1[i-1]==str2[j-1]){
maxlen[i][j]=maxlen[i-1][j-1]+1;
p[i][j]=1;
}
else if(maxlen[i-1][j]>maxlen[i][j-1]){
maxlen[i][j]=maxlen[i-1][j];
p[i][j]=2;
}
else{
maxlen[i][j]=maxlen[i][j-1];
p[i][j]=3;
}
}
}
print(l1,l2);
sort(str,str+cnt);
for(int i=0;i<cnt;i++)
printf("%c",str[i]);
printf("\n");
}
}