当前位置: 首页 > 知识库问答 >
问题:

最长公共子序列不打印长度矩阵

程化
2023-03-14

我试图在c中实现最长公共子序列算法,矩阵c[]]存储最长公共子序列的长度,行[][]存储c[]]矩阵中的父块行,列[][]存储父块列。

我对解决LCS的方法非常不便和低效表示歉意,但什么都没有打印出来。请帮忙。

#include<stdio.h>
#include<stdlib.h>
void lcs(char *a,char *b,int i,int j)
{
    int x,y,z;
    int **c=(int **)malloc((j+1)*sizeof(int *));
    for(x=0;x<j+1;x++)
    {
        *(c+x)=(int *)malloc((i+1)*sizeof(int));
        *(*(c+x)+0)=0;
    }
    for(y=0;y<i+1;i++)
        c[0][y]=0;
    int **row=(int **)malloc((j+1)*sizeof(int *));
    for(x=0;x<j+1;x++)
    {
        *(row+x)=(int *)malloc((i+1)*sizeof(int));
        *(*(row+x)+0)=x-1;
    }
    for(y=0;y<i+1;y++)
        row[0][y]=0;
    row[0][0]=0;
    int **col=(int **)malloc((j+1)*sizeof(int *));
    for(x=0;x<j+1;x++)
    {
        *(col+x)=(int *)malloc((i+1)*sizeof(int));
        *(*(col+x)+0)=0;
    }
    for(y=0;y<i+1;y++)
        col[0][y]=y-1;
    col[0][0]=0;
    for(x=1;x<j+1;x++)
    {
        for(y=1;y<i+1;y++)
        {
            if(a[y-1]==b[x-1])
            {
                c[x][y]=c[x-1][y-1]+1;
                row[x][y]=x-1;
                col[x][y]=y-1;
            }
            else if(c[x-1][y]>
                    c[x][y-1])
            {
                c[x][y]=c[x-1][y];
                row[x][y]=x-1;
                col[x][y]=y;
            }
            else
            {
                c[x][y]=c[x][y-1];
                row[x][y]=x;
                col[x][y]=y-1;
            }
        }
    }
    for(x=0;x<j+1;x++)
    {
        for(y=0;y<i+1;y++)
            printf("%d ",c[x][y]);
        printf("\n");
    }
    printf("\n\n");
    for(x=0;x<j+1;x++)
    {
        for(y=0;y<i+1;y++)
            printf("%d,%d ",row[x][y],col[x][y]);
        printf("\n");
    }
    
}
void main()
{
    char a[30]="papayaman";
    char b[30]="papmn";
    lcs(a,b,9,5);
}

共有1个答案

郎长卿
2023-03-14

也许可以简化为这样:

迭代版本(自底向上)

    int lcs(char * A, char * B)
    {
        allocate storage for array L;
        for (i = m; i >= 0; i--)
             for (j = n; j >= 0; j--)
             {
              if (A[i] == '\0' || B[j] == '\0') L[i,j] = 0;
              else if (A[i] == B[j]) L[i,j] = 1 + L[i+1, j+1];
              else L[i,j] = max(L[i+1, j], L[i, j+1]);
             }
        return L[0,0];
      }
====================================================
 类似资料:
  • longestCommonSubsequence正在返回LCS的长度。代码运行良好。但我试图打印子序列的值。例如,它应该打印“acef”。但我的代码只打印“ae”<如何修复? 这是完整的代码https://pastebin.com/Sq4QMtxF

  • 几个小时以来,我一直在尝试实现最长的公共子序列。我已经检查了LCSLength函数是否返回正确的长度,但它没有正确打印序列。 我下面给出的伪代码:http://en.wikipedia.org/wiki/Longest_common_subsequence_problem 如果您能提供任何帮助,我们将不胜感激。 测试案例: 返回4但字符串序列不正确。 返回14 谢谢

  • 问题内容: python中是否有内置函数返回两个列表的最长公共子序列的长度? 我试图找到最长的公共子序列,然后得到它的长度,但是我认为必须有一个更好的解决方案。 问题答案: 您可以轻松地将LCS重新装配为LLCS: 演示: 如果您想要最长的公共 子字符串 (一个 不同 但相关的问题, 子 序列是连续的),请使用: 这与动态编程方法非常相似,但是我们跟踪到目前为止找到的最大长度(因为不再保证表中的最

  • Iam尝试使用以下代码打印所有可能的最长公共子序列 1-首先,我找到了LCS长度dp矩阵,并尝试使用递归生成所有可能的输出。 输入和输出 实际上,每次我将字符添加到输出列表时,我都需要弹出字符并将其插入为旧的附加新的。但是当我添加行时 然后它只显示了LCS的一种可能性,而不是全部。请帮助,我哪里出错了?

  • 然而,我意识到我真正想解决的问题有点不同。给定一个固定的k,我需要确保公共子序列只涉及长度正好为k的子串。例如,设置k=2,并让这两个字符串为 我需要的子序列是“。 是否可以修改动态规划解来解决这个问题?

  • 我已经实现了最长公共子序列算法,并获得了最长的正确答案,但无法找出打印出组成最长公共子序列的方法。 也就是说,我成功地获得了最长公共子序列数组的长度,但我想打印出最长的子序列。 这个代码的操场在这里 http://play.golang.org/p/0sKb_OARnf 当我尝试在标签得到更新时打印出子序列时,结果是重复的。我想为str1和str2打印出类似“GTABTABTABTAB”的东西 提