最长公共子序列的代码未正确显示结果

时间:2013-06-01 18:27:54

标签: c algorithm

我正在为一个解决在给定的两个字符串中找到最长公共子序列的最大长度的问题的程序工作,我观察到它没有向我显示我的2个字符串中的第一个字符。结果矩阵。

示例 - 两个字符串是

  • BDCABA
  • ABCBDAB

结果 -

Result


  

算法中没有错误,但可能有一些错误   在我的C代码中出现故障。

代码 -

 #include<stdio.h> 
    #include<string.h> 
    #define size 20 
    char A[size],B[size]; 
    int i,j,A_len,B_len;
    int score[size][size];
    void main() 
    { 
        printf("\tEnter first string\n\t");
        scanf("%s",A);
        printf("\tEnter second string\n\t");
        scanf("%s",B);
        printf("\n");
        A_len = strlen(A); 
        B_len = strlen(B); 
        A[0] = ' ';
        printf("\t      ");
        for(i=1;i<=B_len;i++) 
            printf("%5c",toupper(B[i]));
        printf("\n\n");
        for(i=0;i<=A_len;i++) 
        { 
            for(j=0;j<=B_len;j++) 
            { 
                if(i==0 || j==0) 
                    score[i][j]=0; 
                else if(A[i] == B[j] ) 
                    score[i][j] = score[i-1][j-1] + 1; 
                else 
                {
                    if(score[i][j-1]>score[i-1][j])
                        score[i][j] = score[i][j-1];
                    else
                        score[i][j] = score[i-1][j];
                }
            } 
        }
        for(i=0;i<=A_len;i++)
        {
            printf("\t%c",toupper(A[i]));
            for(j=0;j<=B_len;j++)
                printf("%5d",score[i][j]);
            printf("\n\n"); 
        }
        if(score[A_len][B_len] != 0)
        {
            printf("Longest common subsequence is of %d length :\t",score[A_len][B_len]);
        }
        else
            printf("longest common subsequence not found");
    }

所有字符串的代码都是返回正确的结果,但它没有在结果中显示输入字符串名称,它会跳过两个字符串的第一个字符,不幸的是我没有出现这种行为的原因,请帮我解决这个问题。
感谢

3 个答案:

答案 0 :(得分:1)

在代码的第15行之后应用此代码,并删除之前的16,17,18和19行。这是工作。

我想,你面临的问题是因为你正在阅读带有%s的字符串而你想在第一个字母后比较你的字符串,以便你可以在那里放置0,正确


    for(i=0;i<A_len;i++) 
        temp[i+1] = A[i]; 
    for(i=1;i<=A_len;i++) 
        A[i] = temp[i];
    A[0] = ' ';
    for(i=0;i<B_len;i++) 
        temp[i+1] = B[i]; 
    printf("\t      ");
    for(i=1;i<=B_len;i++) 
    {   
        B[i] = temp[i];
        printf("%5c",toupper(B[i]));
    }

答案 1 :(得分:0)

你的A [0] =''正在覆盖第一个输入字符串中的第一个字符。对于B,你的第一个打印循环从i = 1开始,这又错过了第二个字符串的第一个字符。

答案 2 :(得分:0)

请注意,在C中,数组的最低索引始终为0.因此,您不能设置A[0]=' ',应该以0开始循环,并以i<length_X结束它们(不是{ {1}})。

但是,你应该采用算法逻辑(<= 一个未命中,因此A[0]==B[0]不是将i==0|j==0设置为0的理由。