用C语言求解最长公共子序列问题,要求具备测试用例及结果展示。
时间: 2024-12-16 07:17:42 浏览: 2
在C语言中,可以使用动态规划(Dynamic Programming)的方法来解决最长公共子序列(Longest Common Subsequence, LCS)问题。这是一种将大问题分解成小问题并存储中间结果的算法。以下是简单的递归版本和自底向上的动态规划版本:
**递归版LCS(C)**
```c
#include <stdio.h>
#define MAX 100
int lcs(char X[MAX], char Y[MAX], int m, int n){
if (m == 0 || n == 0)
return 0;
else if (X[m - 1] == Y[n - 1])
return 1 + lcs(X, Y, m - 1, n - 1);
else
return max(lcs(X, Y, m, n - 1), lcs(X, Y, m - 1, n));
}
// 测试用例
void test_lcs() {
char str1[] = "ABCDGH";
char str2[] = "AEDFHR";
int len = strlen(str1);
int len2 = strlen(str2);
printf("Length of LCS is %d\n", lcs(str1, str2, len, len2));
}
int main() {
test_lcs();
return 0;
}
```
这个版本的时间复杂度较高,为O(2^min(m,n))。
**动态规划版LCS(C)**
```c
#include <stdio.h>
#include <string.h>
int lcs_dp(char X[], char Y[], int m, int n){
int L[m+1][n+1];
for(int i=0; i<=m; i++) {
for(int 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] = max(L[i-1][j], L[i][j-1]);
}
}
return L[m][n];
}
// 测试用例
void test_lcs_dp() {
char str1[] = "ABCDGH";
char str2[] = "AEDFHR";
int len = strlen(str1);
int len2 = strlen(str2);
printf("Length of LCS is %d\n", lcs_dp(str1, str2, len, len2));
}
int main() {
test_lcs_dp();
return 0;
}
```
动态规划版本的时间复杂度为O(m*n),效率更高。
**
阅读全文