时间复杂度O(m*n)
#include <iostream> #include <cstring> #include <cstdlib> #include <stdio.h> #include <algorithm> #include <string> #include <math.h> #include <stdlib.h> #define INF 0x3f3f3f3f #define maxn 10000+10 #define cle(a) memset(a,0,sizeof(a)) using namespace std; char a[maxn],b[maxn]; int dp[maxn][maxn]; int main() { while(cin>>a>>b){ int la=strlen(a); int lb=strlen(b); for(int i=0;i<la;i++)dp[i][0]=0; for(int j=0;j<lb;j++)dp[0][j]=0; //cle(dp) for(int i=1;i<=la;i++) for(int j=1;j<=lb;j++){ if(a[i-1]==b[j-1])dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } printf("%d ",dp[la][lb]); } return 0; }
如果要输出最长公共子序列,可以添加flag[][]数组,进行转移方向的记录,逆推。
#include <iostream> #include <cstring> #include <cstdlib> #include <stdio.h> #include <algorithm> #include <string> #include <math.h> #include <stdlib.h> #define INF 0x3f3f3f3f #define maxn 500+10 #define cle(a) memset(a,0,sizeof(a)) using namespace std; char a[maxn],b[maxn]; int dp[maxn][maxn]; int flag[maxn][maxn]; char lcs[maxn]; int main() { while(cin>>a>>b){ int la=strlen(a); int lb=strlen(b); for(int i=0;i<la;i++)dp[i][0]=0; for(int j=0;j<lb;j++)dp[0][j]=0; //cle(dp) for(int i=1;i<=la;i++) for(int j=1;j<=lb;j++){ if(a[i-1]==b[j-1]){ dp[i][j]=dp[i-1][j-1]+1; flag[i][j]=1;//向右下转移 } else{ if(dp[i-1][j]>dp[i][j-1]){ flag[i][j]=2;//向下转移 dp[i][j]=dp[i-1][j]; } else{ flag[i][j]=3;//向右转移 dp[i][j]=dp[i][j-1]; } } } int i=la,j=lb; int k=0; while(i>0&&j>0){ if(flag[i][j]==1){ lcs[k]=a[i-1]; k++,i--,j--; } else if(flag[i][j]==2)i--; else if(flag[i][j]==3)j--; } printf("%d ",dp[la][lb]); for(int i=k-1;i>=0;i--) printf("%c",lcs[i]); } return 0; }