用C语言写最长公共子序列问题:给定两个序列X={x1,X2..}和Y={Y1,Y2...},找出X和Y的最长的公共子序列长度,并写出序列
时间: 2024-02-24 16:57:03 浏览: 64
求最长公共子序列,c语言编程
5星 · 资源好评率100%
以下是用C语言实现最长公共子序列问题的代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
int lcs(char X[], char Y[], int m, int n)
{
int L[m + 1][n + 1];
int i, j;
for (i = 0; i <= m; i++) {
for (j = 0; j <= n; j++) {
if (i == 0 || j == 0) {
L[i][j] = 0;
} else if (X[i - 1] == Y[j - 1]) {
L[i][j] = L[i - 1][j - 1] + 1;
} else {
L[i][j] = (L[i - 1][j] > L[i][j - 1]) ? L[i - 1][j] : L[i][j - 1];
}
}
}
int index = L[m][n];
char lcs[index + 1];
lcs[index] = '\0';
i = m;
j = n;
while (i > 0 && j > 0) {
if (X[i - 1] == Y[j - 1]) {
lcs[index - 1] = X[i - 1];
i--;
j--;
index--;
} else if (L[i - 1][j] > L[i][j - 1]) {
i--;
} else {
j--;
}
}
printf("序列为:%s\n", lcs);
return strlen(lcs);
}
int main()
{
char X[MAX_LEN], Y[MAX_LEN];
printf("请输入两个序列:\n");
scanf("%s%s", X, Y);
int m = strlen(X);
int n = strlen(Y);
int len = lcs(X, Y, m, n);
printf("最长公共子序列长度为:%d\n", len);
return 0;
}
```
输入示例:
```
请输入两个序列:
ABCBDAB
BDCABA
```
输出示例:
```
序列为:BCBA
最长公共子序列长度为:4
```
其中,`lcs()`函数用于计算最长公共子序列。在该函数中,首先创建一个二维数组`L`,用于存储中间结果。接着,使用两个循环遍历`L`数组,根据动态规划的思想,计算出`X`和`Y`的最长公共子序列长度。最后,根据`L`数组中的信息,构建出最长公共子序列并打印输出。
阅读全文