[英]Longest common subsequence for 3+ sequences in c
我已经写过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数组来存储序列来解决这个问题。
迭代过程可能是解决问题的一种方法。 但是最大长度的子序列可以在第一个字符串中的任何地方开始。 由于在过程中引入了新的字符串,因此保持当前的最大子序列是不够的。 这是一种存储字符串数组的方法:
char s[nb][N]; //nb strings of max length N-1
您可以尝试保留数组int seqlen[j]
跟踪,只要第一个字符串s[0]
,存储从第一个字符串s[0]
中的第j
位开始的最大公共子序列的长度。
初始化:如果s[0]
是唯一的字符串, strlen(s[0])-j
地址j
开始的最大公共子序列的长度是strlen(s[0])-j
引入新的字符串s[i]
: seqlen[j]
需要更新(对于所有j)。 创建s[0]
的当前子字符串的副本temp
,从长度为seqlen[j]
s[0][j]
seqlen[j]
。 这是strstr(temp,s[i])
可以使用的地方。 同时strstr()
返回NULL和seqlen[j]>0
,减小的尺寸temp
通过引入空终止字符'\\0'
在端部temp
和减少seqlen[j]
最后, seqlen[j]
是从第一个字符串s[0]
中的位置j
开始的最大公共子序列的长度。
最后一步是取seqlen[j]
的最大值,即最大公共子串的长度。 该子串从s[0]
中的相应位置j
开始
内存占用和算法细化:找到最小的字符串并将其用作s[0]
。
算法细化:可以使用二进制搜索方法更新更新seqlen[j]
的过程。
内存细化:使用malloc()
为字符串数组分配内存,同时考虑字符串的确切长度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.