题目链接:点击打开链接
给出两段字符串数组, 每段以"#"结尾, 要求输出两段字符串数组最长的公共字符串.
lcs题目, 增加了一个flag数组保存字符串比较结果, 用于最后递归数据答案.
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int MAXN = 105;
char s1[MAXN][MAXN], s2[MAXN][MAXN];
int dp[MAXN][MAXN], flag[MAXN][MAXN], len1, len2;
void lcs()
{
for(int i = 1; i <= len1; ++i)
for(int j = 1; j <= len2; ++j) {
if(strcmp(s1[i - 1], s2[j - 1]) == 0) {
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];
}
}
}
}
void print(int x, int y)
{
if(!x || !y) return;
if(flag[x][y] == 1) {
print(x - 1, y - 1);
printf("%s ", s1[x - 1]);
}
else if(flag[x][y] == 2) print(x - 1, y);
else print(x, y - 1);
}
int main(int argc, char const *argv[])
{
while(scanf("%s", s1[0]) != EOF) {
for(len1 = 1; ; ++len1) {
scanf("%s", s1[len1]);
if(strcmp(s1[len1], "#") == 0) break;
}
for(len2 = 0; ; ++len2) {
scanf("%s", s2[len2]);
if(strcmp(s2[len2], "#") == 0) break;
}
lcs();
print(len1, len2);
printf("\n");
}
return 0;
}