使用动态规划算法实现最长公共子序列问题,输出最长公共子序列,c语言
时间: 2023-11-11 17:17:25 浏览: 112
利用动态规划算法解决最长公共子序列问题.doc
以下是使用动态规划算法实现最长公共子序列问题,并输出最长公共子序列的C语言代码:
```c
#include <stdio.h>
#include <string.h>
#define MAXLEN 100
void LCS(char *str1, char *str2, int len1, int len2, int dp[MAXLEN][MAXLEN]) {
// 计算dp数组
for (int i = 0; i <= len1; i++) {
for (int j = 0; j <= len2; 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];
}
}
}
// 回溯找到最长公共子序列
int index = dp[len1][len2];
char lcs[index + 1];
lcs[index] = '\0';
int i = len1, j = len2;
while (i > 0 && j > 0) {
if (str1[i - 1] == str2[j - 1]) {
lcs[index - 1] = str1[i - 1];
i--;
j--;
index--;
} else if (dp[i - 1][j] > dp[i][j - 1]) {
i--;
} else {
j--;
}
}
// 输出最长公共子序列
printf("最长公共子序列为:%s\n", lcs);
}
int main() {
char str1[MAXLEN], str2[MAXLEN];
int dp[MAXLEN][MAXLEN] = {0};
printf("请输入第一个字符串:");
scanf("%s", str1);
printf("请输入第二个字符串:");
scanf("%s", str2);
int len1 = strlen(str1);
int len2 = strlen(str2);
LCS(str1, str2, len1, len2, dp);
return 0;
}
```
该代码在计算dp数组的同时,通过回溯的方式找到最长公共子序列。具体实现方式是,从dp数组的右下角开始,若`str1[i-1]`与`str2[j-1]`相等,则将该字符加入到最长公共子序列中,同时向左上角移动一格;否则,若`dp[i-1][j]`大于`dp[i][j-1]`,则向上移动一格,否则向左移动一格。最后输出最长公共子序列即可。
阅读全文