写出最长公共子序列的c语言代码
时间: 2024-06-19 07:03:55 浏览: 111
以下是一份可以实现最长公共子序列的C语言代码示例:
```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){
int L[m+1][n+1];
int i,j;
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]);
}
}
return L[m][n];
}
int main(){
char X[]="AGGTAB";
char Y[]="GXTXAYB";
int m=strlen(X);
int n=strlen(Y);
printf("Length of LCS is %d\n",lcs(X,Y,m,n));
return 0;
}
```
相关问题
问题描述:要求输入两个字符序列,求出这两个字符序列的最长公共子序列长度,并输出最长公共子序列。 ●输入样例: ●请输入第一个字符序列:ABABCCC ●请输入第二个字符序列:BACBAAAAADC ●输出样例: ●第一个字符序列:ABABCCC ●第二个字符序列:BACBAAAAADC ●最长公共子序列长度为:5 ●最长公共子序列是BABC 用c语言代码怎么写
下面是使用动态规划求解最长公共子序列问题的 C 代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 1000
int max(int a, int b) {
return a > b ? a : b;
}
void LCS(char *s1, char *s2, int len1, int len2) {
int dp[MAX_LENGTH][MAX_LENGTH];
int i, j;
char result[MAX_LENGTH];
int index = 0;
// 初始化边界值
for (i = 0; i <= len1; i++) {
dp[i][0] = 0;
}
for (i = 0; i <= len2; i++) {
dp[0][i] = 0;
}
// 动态规划求解
for (i = 1; i <= len1; i++) {
for (j = 1; j <= len2; j++) {
if (s1[i-1] == s2[j-1]) {
dp[i][j] = dp[i-1][j-1] + 1;
} else {
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
}
// 构造最长公共子序列
i = len1;
j = len2;
while (i > 0 && j > 0) {
if (s1[i-1] == s2[j-1]) {
result[index++] = s1[i-1];
i--;
j--;
} else {
if (dp[i-1][j] > dp[i][j-1]) {
i--;
} else {
j--;
}
}
}
// 输出最长公共子序列
printf("最长公共子序列为:");
for (i = index-1; i >= 0; i--) {
printf("%c", result[i]);
}
printf("\n");
}
int main() {
char s1[MAX_LENGTH], s2[MAX_LENGTH];
int len1, len2;
printf("请输入第一个字符序列:");
gets(s1);
printf("请输入第二个字符序列:");
gets(s2);
len1 = strlen(s1);
len2 = strlen(s2);
LCS(s1, s2, len1, len2);
return 0;
}
```
注意:该代码中使用了 `gets()` 函数来读取字符串,该函数存在缓冲区溢出的风险,建议使用更加安全的读取字符串方式。
c语言写一个求最长公共子序列长度具体代码
当然,我可以帮您写出求最长公共子序列长度的C语言代码。以下是示例代码:
```
#include <stdio.h>
#include <string.h>
#define MAX_LENGTH 100
int max(int a, int b) {
return (a > b) ? a : b;
}
int longestCommonSubsequence(char* s1, char* s2) {
int m = strlen(s1);
int n = strlen(s2);
int dp[m + 1][n + 1];
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= n; j++) {
if (i == 0 || j == 0)
dp[i][j] = 0;
else if (s1[i - 1] == s2[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 s1[MAX_LENGTH], s2[MAX_LENGTH];
printf("请输入两个字符串(用空格分隔):\n");
scanf("%s %s", s1, s2);
int res = longestCommonSubsequence(s1, s2);
printf("最长公共子序列的长度为:%d", res);
return 0;
}
```
希望这段代码能对您有所帮助。如果您还有其它问题,可以继续问我。
阅读全文