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

Longest substring (for sequences of triplets)

我试图比较字符串的格式:aaa-abc-lap-asz-ask;基本上是用破折号分隔的三个字母。

我试图找出两个任意长度的序列(从1到30个三联体)之间的共同三联体的最长序列。

例如,a a a-bbb-ccc-aaa-ddd-eee-bbb和bbb-aaa-ddd-eee-bbb,您可以找到5个序列(bbb-aaa-ddd-eee-bbb,即使第二个序列中不存在ccc)。

不应该考虑用破折号来比较;它们只是用来分隔三连音。

我使用的是python,但这只是一个通用的算法,应该可以做到:)


我认为您正在寻找最长的通用子序列算法,它可以非常快地找到这个序列(在O(n2)时间)。该算法基于一个简单的动态编程循环,并且有许多关于如何实现该算法的在线示例。

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

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

希望这有帮助!


生物信息学中常用的序列对齐算法可以在这里使用。它们主要用于对齐一个字符序列,但可以修改为接受n个字符序列。Needeman-Wunsch算法是一种相当有效的算法。


首先,您至少可以通过计算集合对称差来减少问题,以消除两个序列中没有出现的任何三元组。

对于最长的子序列,该算法使用动态规划方法。对于每个三联体,找出长度为2的最短子串。循环这些对,尝试通过组合这些对来扩展它们。一直延伸,直到每个三联体都有最长的延伸。选择其中最长的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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.