最长子串(用于三元组序列)

时间:2011-12-19 19:05:22

标签: python string algorithm comparison

我正在尝试比较格式的字符串:AAA-ABC-LAP-ASZ-ASK;基本上,由破折号分隔的三字母。

我试图找出2个这样的任意长度序列(从1到30个三元组)中最常见的三元组序列。

例如,AAA-BBB-CCC-AAA-DDD-EEE-BBB和BBB-AAA-DDD-EEE-BBB,你可以找到5的序列(BBB-AAA-DDD-EEE-BBB,即使CCC不存在于第二序列中。)

不应考虑破折号进行比较;他们只是将三胞胎分开。

我正在使用Python,但只需要通用算法来实现这一点:)

3 个答案:

答案 0 :(得分:5)

我认为您正在寻找Longest Common Subsequence算法,该算法可以非常快速地找到此序列(在O(n 2 )时间内)。该算法基于简单的动态编程重现,在线有很多关于如何实现算法的例子。

直观地说,该算法使用以下递归分解,通过查看每个序列的第一个三元组来工作:

  • 如果任一序列为空,则最长的公共子序列为空序列。
  • 否则:
    • 如果每个序列的第一个三元组匹配,则LCS是该元素,后跟两个序列的余数的LCS。
    • 如果不是,则LCS是以下中的较长者:第一序列的LCS和除第二序列的第一元素之外的所有元素,或第二序列的LCS以及除第一序列的第一元素之外的所有元素。

希望这有帮助!

答案 1 :(得分:1)

这里可以使用生物信息学中常用的

Sequence alignment算法。它们主要用于对齐单字符序列,但可以修改它们以接受n字符序列。 Needleman–Wunsch algorithm是一个效率很高的人。

答案 2 :(得分:0)

首先,您可以通过计算set symmetric difference来消除两个序列中不存在的任何三元组,从而至少减少问题。

对于最长的子序列,算法使用dynamic programming方法。对于每个三元组,找到两者中出现的长度为2的最短子串。循环遍历这些对,试图通过组合对来扩展它们。继续延伸,直到你拥有每个三元组的所有最长扩展名。选择最长的那些:

ABQACBBA
ZBABBA

Eliminate symmetric difference
ABABBA and BABBA


Start with the first A in ABABBA.
It is followed by B, giving the elements [0,1]
Check to see if AB is in BABBA, and record a match at [1,2]
So, the first pair is ((0,1), (1,2))

Next, try the first B in ABABBA.
It is followed by an A giving the elements [1,2]
Check to see if BA is in BABBA and record a match at [0,1]

Continue with the rest of the letters in ABABBA.

Then, try extensions.

The first pair AB at [0,1] and [1,2] can be extended from BA
to ABA [0,1,3] and [1,2,4].  Note, the latter group is all the
way to the right so it cannot be extended farther.  ABA cannot
be extended.

Continue until all sequences have extended are far as possible.
Keep only the best of those.