c语言求最长公共子序列
时间: 2024-04-19 11:21:10 浏览: 139
C语言中求最长公共子序列可以使用动态规划算法来实现。下面是一种常见的实现方式:
1. 首先定义一个二维数组dp[m+1][n+1],其中m和n分别表示两个字符串的长度。
2. 初始化dp数组的第一行和第一列为0,表示空字符串与任意字符串的最长公共子序列长度为0。
3. 从第二行和第二列开始,遍历两个字符串的每个字符:
- 如果两个字符相等,则dp[i][j] = dp[i-1][j-1] + 1,表示当前位置的最长公共子序列长度等于左上角位置的最长公共子序列长度加1。
- 如果两个字符不相等,则dp[i][j] = max(dp[i-1][j], dp[i][j-1]),表示当前位置的最长公共子序列长度等于上方位置和左方位置的最长公共子序列长度的较大值。
4. 最后,dp[m][n]即为两个字符串的最长公共子序列的长度。
下面是一个示例代码:
```c
#include <stdio.h>
#include <string.h>
int max(int a, int b) {
return (a > b) ? a : b;
}
int longestCommonSubsequence(char* text1, char* text2) {
int m = strlen(text1);
int n = strlen(text2);
int dp[m+1][n+1];
for (int i = 0; i <= m; i++) {
dp[i] = 0;
}
for (int j = 0; j <= n; j++) {
dp[j] = 0;
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (text1[i-1] == text2[j-1]) {
dp[i][j] = dp[i-1][j-1] + 1;
} else {
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
}
return dp[m][n];
}
int main() {
char text1[] = "ABCBDAB";
char text2[] = "BDCAB";
int result = longestCommonSubsequence(text1, text2);
printf("最长公共子序列的长度为:%d\n", result);
return 0;
}
```
阅读全文