请用C语言动态规划法写出该题:给定两个字符串A,B,长度分别为m和n,要求找出他们最长的公共子序列,并返回其长度。
时间: 2023-11-20 19:23:15 浏览: 84
好的,下面是用 C 语言动态规划法实现查找两个字符串最长公共子序列的代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 100
int lcs(char* str1, char* str2, int m, int n)
{
int dp[MAX_LEN][MAX_LEN];
int i, j;
// 初始化 dp 数组
for (i = 0; i <= m; i++) {
for (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];
}
int main()
{
char str1[MAX_LEN], str2[MAX_LEN];
int len1, len2;
printf("请输入字符串 A 和字符串 B:\n");
scanf("%s %s", str1, str2);
len1 = strlen(str1);
len2 = strlen(str2);
int res = lcs(str1, str2, len1, len2);
printf("最长公共子序列的长度为 %d\n", res);
return 0;
}
```
在上述代码中,我们定义了一个二维数组 dp 来记录状态转移过程,其中 dp[i][j] 表示字符串 A 的前 i 个字符和字符串 B 的前 j 个字符的最长公共子序列长度。然后,我们使用双重循环来遍历字符串 A 和字符串 B,根据状态转移方程来更新 dp 数组。最终,dp[m][n] 中记录的就是字符串 A 和字符串 B 的最长公共子序列的长度。
希望这个代码能够帮助到你!
阅读全文