在此两段代码,先粘别人的吧,写的比我好
#include<cstdio> #include<cstring> using namespace std; char a[105],b[105]; int pre[105][105]; void out(int i,int j) { if(!i&&!j)return; if(pre[i][j]==j+1) { out(i-1,j-1); putchar(a[i]); } else if(pre[i][j]==j) { out(i-1,j); putchar(a[i]); } else { out(i,j-1); putchar(b[j]); } } void LCS() { int n=strlen(a+1),m=strlen(b+1),i,j,dp[105][105]= {0}; for(i=1; i<=n; i++) for(j=1; j<=m; j++) if(a[i]==b[j]) { dp[i][j]=dp[i-1][j-1]+1; pre[i][j]=j+1; } else if(dp[i][j-1]>dp[i-1][j]) { dp[i][j]=dp[i][j-1]; pre[i][j]=j-1; } else { dp[i][j]=dp[i-1][j]; pre[i][j]=j; } out(n,m); puts(""); } int main() { while(scanf("%s %s",a+1,b+1)==2) LCS(); }
#include<iostream> #include<cstring> #include<cmath> #include<string> #include<cstdio> using namespace std; const int MAXN=105; char s1[MAXN],s2[MAXN]; int f[MAXN][MAXN]; int key[MAXN][MAXN]; char ans[MAXN]; int en,snd,t1,t2; struct node { char c;int pre; }path[MAXN*5]; int MAX(const int a,const int b){return a>b?a:b;} void dp() { int i,j; en=0; memset(f,0,sizeof f); memset(key,-1,sizeof key); for(i=1;i<=t1;i++) for(j=1;j<=t2;j++) { if(s1[i-1]==s2[j-1]) { f[i][j]=f[i-1][j-1]+1; path[en].c=s1[i-1]; path[en].pre=key[i-1][j-1]; key[i][j]=en++; } else { if(f[i-1][j]>f[i][j-1]) { f[i][j]=f[i-1][j]; key[i][j]=key[i-1][j]; } else { f[i][j]=f[i][j-1]; key[i][j]=key[i][j-1]; } } } } void showpath(int id) { if(id==-1)return ; showpath(path[id].pre); ans[snd++]=path[id].c; } int main() { int i,j,k; //freopen("123.txt","r",stdin); while(~scanf("%s%s",&s1,&s2)) { t1=strlen(s1); t2=strlen(s2); dp(); snd=0; showpath(key[t1][t2]); ans[snd]='\0'; int cur1=0,cur2=0,cur3=0; while(1) { if(s1[cur1]==ans[cur3]&&s2[cur2]!=ans[cur3]) { printf("%c",s2[cur2++]); } else if(s2[cur2]==ans[cur3]&&s1[cur1]!=ans[cur3]) { printf("%c",s1[cur1++]); } else if(s1[cur1]==s2[cur2]&&s2[cur2]==ans[cur3]) { printf("%c",s2[cur2++]); cur1++;cur3++; } else { printf("%c%c",s1[cur1++],s2[cur2++]); } if(cur3==snd) { printf("%s%s",s1+cur1,s2+cur2); break; } } printf("\n"); } return 0; }