【问题标题】:Longest common subsequence for 3+ sequences in cc中3+序列的最长公共子序列
【发布时间】:2014-12-24 08:57:30
【问题描述】:

我已经写了 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];
    }

谢谢大家~我已经用二维数组存储序列解决了这个问题。

【问题讨论】:

  • 您是否查看过strstr 函数来测试子字符串是否存在,然后一个简单的指针递增,直到字符串不同以获得每个匹配的长度。可能比i,j,k 索引操作更不容易出错。

标签: c lcs


【解决方案1】:

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

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

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

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

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

最后一步是取seqlen[j]的最大值,即最大公共子串的长度。这个子串从s[0]中的对应位置j开始

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

算法优化:更新seqlen[j] 的过程可以使用二分搜索方法进行更新。

内存优化:使用malloc()为字符串数组分配内存,同时考虑字符串的确切长度。

【讨论】:

  • 我想我用了类似的方式。但我仍然没有使用 strstr().:p 谢谢!
猜你喜欢
  • 2011-03-01
  • 2013-12-06
  • 2011-02-25
  • 2013-02-13
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多