利用编辑距离计算 然后敲模板,得最大公共字串长度
然后进行回溯,得最长公共子串
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int dp[1001][1001];
char X[1001];
char Y[1001];
int i, j;
int main()
{
cin.getline(X,1001);
cin.getline(Y,1001);
int xlen = strlen(X);
int ylen = strlen(Y);
for(i = 1; i <= xlen; ++i)
{
for(j = 1; j <= ylen; ++j)
{
if(X[i-1] == Y[j-1])
{
dp[i][j] = dp[i-1][j-1] + 1;
}
else if(dp[i][j-1] > dp[i-1][j])
{
dp[i][j] = dp[i][j-1];
}
else
{
dp[i][j] = dp[i-1][j];
}
}
}
i = xlen;
j = ylen;
int k = dp[i][j];//最长公共字串的长度
char lcs[1001] = {'\0'};
while(i && j)// 回溯 求子串
{
if(X[i-1] == Y[j-1] && dp[i][j] == dp[i-1][j-1] + 1)
{
lcs[--k] = X[i-1];
i--;
j--;
}
else if(X[i-1] != Y[j-1] && dp[i-1][j] > dp[i][j-1]) i--;
else j--;
}
printf("%s\n",lcs);
}