我试图在多个序列中找到最长的公共子串(LCS)。
CPAN上有许多模块为2个序列实现LCS算法,例如 Algorithm::Diff和 String::LCSS_XS,但我很难进入扩展它们以使用超过2个序列,因为跨多个序列的LCS不一定是它们中任何两个之间的LCS。
值得注意的是,尽管它的名称,Algorith::MLCS实际上并没有返回LCS,而是返回了许多数组的所有公共元素(也是非连续的)。我的印象是它被设计破坏了,但我可能错了。
Algorithm::Diff和Algorith::MLCS解决了最长的常见子序列问题,而不是最长的常见子字符串问题。
是否有明显的方法来扩展n = 2算法或者我是否必须实现我的版本?如果是,怎么样?
感谢。
答案 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;