跨多个序列的最长公共子串

时间:2013-12-14 14:32:29

标签: algorithm perl lcs

我试图在多个序列中找到最长的公共子串(LCS)。

CPAN上有许多模块为2个序列实现LCS算法,例如 Algorithm::Diff String::LCSS_XS,但我很难进入扩展它们以使用超过2个序列,因为跨多个序列的LCS不一定是它们中任何两个之间的LCS。

值得注意的是,尽管它的名称,Algorith::MLCS实际上并没有返回LCS,而是返回了许多数组的所有公共元素(也是非连续的)。我的印象是它被设计破坏了,但我可能错了。

Algorithm::DiffAlgorith::MLCS解决了最长的常见子序列问题,而不是最长的常见子字符串问题。

是否有明显的方法来扩展n = 2算法或者我是否必须实现我的版本?如果是,怎么样?

感谢。

1 个答案:

答案 0 :(得分:1)

使用Tree::Suffix模块可以很容易地解决这个问题。

示例:

#!/usr/bin/env perl
use Modern::Perl;
use Bio::SeqIO;
use Tree::Suffix;

my $seqio = Bio::SeqIO->new(
    -file => "fasta_sequences.txt",
    -format => "Fasta");

my @seqs;

while (my $seqobj = $seqio->next_seq) {
    push @seqs, $seqobj->seq;
}

my $tree = Tree::Suffix->new(@seqs);
my @lcss = $tree->lcs;

say $_ for @lcss;