c中3+序列的最长公共子序列

时间:2014-12-24 08:57:31

标签: c lcs

我已经编写了LCS的部分。
我想知道如果我给N(N> 3),那意味着有多少输入。
像这样:
输入
4 ab abc abcd abcde
输出
3
只要找到那些lcs中最长的一个(3个序列,一个部分)
ab abc abcd-> ab-> 2
abc abcd abcde-> abc-> 3
3→2
我的想法是,每个数量的集合只使用3个序列的方式然后找到最大的序列 但我不知道怎么做或更好的方式?
这是我的代码的一部分:

#define EQUAL(x,y,z) ((x)==(y)&&(y)==(z)) 


int main(){

int set;
int longest;

while (scanf("%d", &set) != EOF){
    while (set){
        scanf("%s", c1);
        set--;
        scanf("%s", c2);
        set--;
        scanf("%s", c3);
        set--;
        longest = LCS(strlen(c1), strlen(c2), strlen(c3));
    }
}
return 0;
}

LCS:

int LCS(int c1_length, int c2_length, int c3_length)
    {
        memset(lcs, 0, N*N);
        int i;
        int j;
        int k;
        for (i = 1; i <= c1_length; i++)
            for (j = 1; j <= c2_length; j++)
                for (k = 1; k <= c3_length; k++)
                {
            if (EQUAL(c1[i], c2[j], c3[k]))
                lcs[i][j][k] = lcs[i - 1][j - 1][k - 1] + 1;
            else
                lcs[i][j][k] = max(lcs[i - 1][j][k], lcs[i][j - 1][k], lcs[i][j][k - 1]);
                }
        return lcs[i - 1][j - 1][k - 1];
    }

谢谢大家〜我通过使用2d数组来存储序列来解决这个问题。

1 个答案:

答案 0 :(得分:0)

迭代程序可能是解决问题的一种方法。但是最大长度的子序列可以在第一个字符串中的任何地方开始。由于在过程中引入了新的字符串,因此保持当前的最大子序列是不够的。这是一种存储字符串数组的方法:

char s[nb][N]; //nb strings of max length N-1

您可以尝试跟踪数组int seqlen[j]的跟踪,只要第一个字符串s[0],在第一个字符串中存储从j处开始的最大公共子序列的长度s[0]

初始化:如果s[0]是唯一的字符串,那么从j开始的最大公共子序列的长度为strlen(s[0])-j

引入新字符串s[i]seqlen[j]需要更新(对于所有j)。 从长度为temp的{​​{1}}开始,创建s[0]当前子字符串的副本s[0][j]。这是seqlen[j]可以使用的地方。虽然strstr(temp,s[i])返回NULL和strstr(),但通过在seqlen[j]>0末尾引入空终止字符temp来减少'\0'的大小并减少temp }。最后,seqlen[j]是从第一个字符串seqlen[j]中的j处开始的最大公共子序列的长度。

最后一步是取最大s[0],即最大公共子串的长度。此子字符串从seqlen[j]

中的相应位置j开始

内存占用和算法优化:找到最小的字符串并将其用作s[0]

算法细化:可以使用二进制搜索方法更新更新s[0]的过程。

内存细化:使用seqlen[j]为字符串数组分配内存,同时考虑字符串的确切长度。