穷举法求最长公共子序列c语言
时间: 2024-03-30 20:31:11 浏览: 89
根据提供的引用内容,穷举法求最长公共子序列的C语言实现如下[^1]:
```c
#include<stdio.h>
#include<string.h>
int max(int a, int b) {
return (a > b) ? a : b;
}
int lcs(char *X, char *Y, int m, int n) {
if (m == 0 || n == 0)
return 0;
if (X[m - 1] == Y[n - 1])
return 1 + lcs(X, Y, m - 1, n - 1);
else
return max(lcs(X, Y, m, n - 1), lcs(X, Y, m - 1, n));
}
int main() {
char X[] = "ABCBDAB";
char Y[] = "BDCAB";
int m = strlen(X);
int n = strlen(Y);
printf("Length of LCS is %d\n", lcs(X, Y, m, n));
return 0;
}
```
该程序使用递归的方式实现了穷举法求解最长公共子序列的长度。在主函数中,我们定义了两个字符串X和Y,并计算它们的长度。然后,调用lcs函数来计算最长公共子序列的长度,并将结果打印出来。
相关问题
C语言穷举法实现最长公共子序列
C语言中可以使用穷举法(也称为暴力法)来实现最长公共子序列(Longest Common Subsequence,简称LCS)。穷举法是一种简单但效率较低的算法,它通过遍历所有可能的子序列来找到最长公共子序列。
以下是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 m, int n) {
if (m == 0 || n == 0) {
return 0;
}
if (str1[m - 1] == str2[n - 1]) {
return 1 + lcs(str1, str2, m - 1, n - 1);
} else {
return max(lcs(str1, str2, m, n - 1), lcs(str1, str2, m - 1, n));
}
}
int main() {
char str1[] = "ABCD";
char str2[] = "ACDF";
int m = strlen(str1);
int n = strlen(str2);
int result = lcs(str1, str2, m, n);
printf("最长公共子序列的长度为:%d\n", result);
return 0;
}
```
上述代码中,我们定义了一个递归函数`lcs`来计算最长公共子序列的长度。函数中使用了两个指针`m`和`n`来表示两个字符串的长度,通过比较字符是否相等来确定是否属于公共子序列。如果字符相等,则递归调用`lcs`函数,并将两个指针都向前移动一位;如果字符不相等,则分别递归调用`lcs`函数,一个指针向前移动一位,另一个指针保持不变。最后,返回两种情况中的较大值。
运行上述代码,将输出最长公共子序列的长度为3。
最长公共子序列穷举法并输出最长子序列c语言代码
最长公共子序列(Longest Common Subsequence,简称LCS)是指在两个序列中找到最长的公共子序列的问题。穷举法是一种解决LCS问题的简单方法,其基本思想是通过遍历所有可能的子序列,找到最长的公共子序列。
以下是使用C语言实现LCS穷举法的代码:
```c
#include <stdio.h>
#include <string.h>
int max(int a, int b) {
return (a > b) ? a : b;
}
void lcs(char* X, char* Y, int m, int n) {
int L[m + 1][n + 1];
int i, j;
// 构建L[m+1][n+1]数组
for (i = 0; i <= m; i++) {
for (j = 0; j <= n; j++) {
if (i == 0 || j == 0)
L[i][j] = 0;
else if (X[i - 1] == Y[j - 1])
L[i][j] = L[i - 1][j - 1] + 1;
else
L[i][j] = max(L[i - 1][j], L[i][j - 1]);
}
}
// 打印最长公共子序列
int index = L[m][n];
char lcs[index + 1];
lcs[index] = '\0';
i = m;
j = n;
while (i > 0 && j > 0) {
if (X[i - 1] == Y[j - 1]) {
lcs[index - 1] = X[i - 1];
i--;
j--;
index--;
}
else if (L[i - 1][j] > L[i][j - 1])
i--;
else
j--;
}
printf("最长公共子序列为:%s\n", lcs);
}
int main() {
char X[] = "ABCBDAB";
char Y[] = "BDCAB";
int m = strlen(X);
int n = strlen(Y);
lcs(X, Y, m, n);
return 0;
}
```
阅读全文