竹然枫 2016-02-14 07:50 采纳率: 66.7%
浏览 4571
已采纳

求助大神:c语言求最长公共子序列问题

我写的这个能正确求出最长序列元素个数但是输出的最长序列却是乱码,求大神指教。代码如下:
#include
#include
#include
#define MAX 101

int Long(char a[],char b[],char result[] )
{

int m,n;

m=strlen(a);
n=strlen(b);
int str[MAX][MAX];
int i,j,sum;

for(i=0;i<=m;i++)
{
    str[i][0]=0;
}
for(i=0;i<=n;i++)
{
    str[0][i]=0;
}
for(i=1;i<=m;i++)
{
    for(j=1;j<=n;j++)
    {
        if(a[i-1]==b[j-1])
        {
            str[i][j]=str[i-1][j-1]+1; 
        }
        else if(str[i-1][j]<str[i][j-1])
        {
            str[i][j]=str[i][j-1];
        }
        else
        {
            str[i][j]=str[i-1][j];
        }

    }
}

sum=str[m][n];
return sum;
   result[sum]='\0';
while(sum>=1)
{
    if(a[m-1]==b[n-1])
    {

      result[--sum]=a[m-1]; 
        m--;
        n--;

    }
    else if(str[m-1][n]<str[m][n-1])
    {

        n--;
    }
    else
    {
        m--;
    }
}

}

int main(void)
{
char a[MAX],b[MAX];
char result[MAX];
int i;
printf("请输入数组a:\n");
gets(a);
printf("请输入数组b:\n");
gets(b);

Long(a,b,result);
printf("%d\n",Long(a,b,result));
printf("%s",result);

system("PAUSE");
return 0;

}

  • 写回答

4条回答 默认 最新

  • threenewbee 2016-02-14 11:22
    关注
     #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define MAX 101
    
    char * t;
    int * i;
    
    int cmp(const void * p, const void * q)
    {
        return strcmp(&t[*(int *)p], &t[*(int *)q]);
    }
    
    void Long(char* a, char* b, char ** c)
    {  
        t = new char[strlen(a) + strlen(b) + 2];
        strcpy(t, a);
        t[strlen(a)] = '#';
        strcpy(t + strlen(a) + 1, b);
        i = new int[strlen(a) + strlen(b) + 1];
        for (int j = 0; j < strlen(a) + strlen(b) + 1; j++) i[j] = j;
        qsort(i, strlen(a) + strlen(b) + 1, sizeof(int), cmp);
        int ma = 0;
        *c = (t + i[0]);
        for (j = 1; j < strlen(a) + strlen(b) + 1; j++)
        {
            int h = 0;
            char * l = &t[i[j - 1]];
            char * m = &t[i[j]];
            if ((i[j - 1] > strlen(a) && i[j] < strlen(a)) || (i[j] > strlen(a) && i[j - 1] < strlen(a)))
            {
                while (*l == *m && (*l) !='#' && (*m) !='#')
                {
                    h++;
                    l++;
                    m++;
                }
                if (h > ma)
                {
                    ma = h;
                    *c = (t + i[j]);
                }
            }
        }
        (*c)[ma] = '\0';
    }
    
    int main(void)
    {
        char a[MAX], b[MAX];
        printf("请输入数组a:\n");
        gets(a);
        printf("请输入数组b:\n");
        gets(b);
        char * c;
        Long(a,b,&c);
        printf("%s\n", c);
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗