c语言最长公共子序列
时间: 2023-11-25 15:48:35 浏览: 179
C语言求最长公共子序列
C语言最长公共子序列是指在两个字符串中找到最长的公共子序列的长度,其中公共子序列是指两个或多个序列中以相同顺序出现的字符序列。这个问题可以使用动态规划算法来解决,具体步骤如下:
1. 定义一个二维数组L,其中L[i][j]表示第一个字符串的前i个字符和第二个字符串的前j个字符的最长公共子序列的长度。
2. 初始化L[j]和L[i]为0,因为一个空字符串和任何字符串的最长公共子序列的长度都为0。
3. 对于i>0和j>0,如果第一个字符串的第i个字符和第二个字符串的第j个字符相同,则L[i][j] = L[i-1][j-1] + 1,否则L[i][j] = max(L[i-1][j], L[i][j-1])。
4. 最终L[n][m]就是两个字符串的最长公共子序列的长度。
下面是C语言的代码实现:
```c
#include <stdio.h>
#include <string.h>
int max(int a, int b) {
return a > b ? a : b;
}
int lcs(char *str1, char *str2, int len1, int len2) {
int L[len1+1][len2+1];
int i, j;
for (i = 0; i <= len1; i++) {
for (j = 0; j <= len2; j++) {
if (i == 0 || j == 0) {
L[i][j] = 0;
} else if (str1[i-1] == str2[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[len1][len2];
}
int main() {
char str1[] = "AGGTAB";
char str2[] = "GXTXAYB";
int len1 = strlen(str1);
int len2 = strlen(str2);
printf("Length of LCS is %d\n", lcs(str1, str2, len1, len2));
return 0;
}
```
阅读全文