输出最长公共子序列字母表顺序

来源:互联网 发布:ubuntu squid3 配置 编辑:程序博客网 时间:2024/04/29 23:14

要找到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");    }}


0 0
原创粉丝点击