分享一下简洁的代码(只输出匹配的个数),从第数组第二个元素开始赋值,因为防止数组下标越界!
最长公公子串 Longest Common Substring 匹配的字符串在原串中必须是连续的
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000+1;
int dp[MAXN][MAXN];
int main(){
memset(dp,0,sizeof(dp));
char a[MAXN],b[MAXN];
int ans=0;
a[0]=b[0]=-1;
scanf("%s%s",&a[1],&b[1]);
for(int i=1;i<strlen(a);i++)
for(int j=1;j<strlen(b);j++){
if(b[j]==a[i])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=0;
ans=max(ans,dp[i][j]);
}
printf("%d",ans);
return 0;
}
最长公共子序列 Longest Common Subsequence 匹配的字符串在原串中可以不连续
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000+1;
int dp[MAXN][MAXN];
int main(){
memset(dp,0,sizeof(dp));
char a[MAXN],b[MAXN];
int maxx=0;
a[0]=b[0]=-1;
scanf("%s%s",&a[1],&b[1]);
for(int i=1;i<strlen(a);i++)
for(int j=1;j<strlen(b);j++){
if(b[j]==a[i])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
}
printf("%d",dp[strlen(a)-1][strlen(b)-1]);
return 0;
}