能否提供一个解决最长公共子序列问题的C语言实现代码示例?
时间: 2024-10-23 11:15:16 浏览: 11
当然可以。要在C语言中解决最长公共子序列(Longest Common Subsequence,LCS)问题,我们可以使用动态规划算法。以下是一个简单的C语言代码示例:
```c
#include <stdio.h>
#define MAX_SIZE 100
int lcs(char* str1, char* str2, int m, int n) {
int dp[MAX_SIZE][MAX_SIZE] = {0}; // 动态规划数组
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= n; j++) {
if (i == 0 || j == 0) {
dp[i][j] = 0;
} else if (str1[i - 1] == str2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = (dp[i - 1][j] > dp[i][j - 1]) ? dp[i - 1][j] : dp[i][j - 1];
}
}
}
return dp[m][n]; // 返回最长公共子序列的长度
}
void printLCS(char* str1, char* str2, int m, int n, int index) {
if (m == 0 || n == 0) {
return;
}
if (str1[m - 1] == str2[n - 1]) {
printf("%c", str1[m - 1]);
printLCS(str1, str2, m - 1, n - 1, index);
} else if (dp[m - 1][n] > dp[m][n - 1]) {
printLCS(str1, str2, m - 1, n, index);
} else {
printLCS(str1, str2, m, n - 1, index);
}
}
int main() {
char str1[] = "ABCBDAB";
char str2[] = "BDCAB";
int m = strlen(str1);
int n = strlen(str2);
int lcsLength = lcs(str1, str2, m, n);
printf("Length of LCS is %d\n", lcsLength);
if (lcsLength > 0) {
printf("LCS: ");
printLCS(str1, str2, m, n, lcsLength - 1); // 需要从长度减一,因为动态规划返回的是包括空串在内的LCS长度
}
return 0;
}
```
这个代码首先计算两个字符串的最长公共子序列长度,然后通过回溯打印出具体的子序列。
阅读全文