algorithm - 两个字符串的最大公共(public)连接子串列表

标签 algorithm

假设我们有两个字符串“abcdefgh”和“abudesh”。我希望解决方案是一个列表 ["ab"、"de"、"h"]。所以,我想要一个最大连接的子串列表,这些子串对于两个字符串都是相同的。这有名称吗?什么是解决它的好方法?

编辑:我需要说顺序并不重要,例如,如果我们有两个字符串“abcdefg”和“defkabc”,结果是 ["abc", "def"]。

最佳答案

使用:

from Bio import pairwise2
from itertools import groupby

def maxConnectedSubstrings(strA, strB):
    alignment = pairwise2.align.globalxx(strA, strB)[0]
    grouped = groupby(zip(alignment.seqA, alignment.seqB), key=lambda p: p[0] == p[1])
    return [''.join(ca for ca,cb in g) for k,g in grouped if k]

print( maxConnectedSubstrings('abcdefgh', 'abudesh') )
# ['ab', 'de', 'h']

解释

首先,我们比对序列。 alignment = pairwise2.align.globalxx(strA, strB)[0] 的结果是:

alignment.seqA = 'abcdefgh'
alignment.seqB = 'abude-sh'

比对算法找到了在序列中添加 '-' 以比对它们的最佳方法。

然后,我们在 zip(alignment.seqA, alignment.seqB) 上使用 groupbyzip(...) 是一对序列(来自 seqA 的字符,来自 seqB 的字符)。我们用键 lambda p: p[0] == p[1] 对这些对进行分组,结果如下:

grouped = groupby(zip(alignment.seqA, alignment.seqB), key=lambda p: p[0] == p[1])

grouped = [
    (True,  [('a', 'a'),
             ('b', 'b')]),
    (False, [('c', 'u')]),
    (True,  [('d', 'd'),
             ('e', 'e')]),
    (False, [('f', '-'),
             ('g', 's')]),
    (True,  [('h', 'h')])
]

最后,我们丢弃 False 组,并加入每个 True 组的字母。

关于algorithm - 两个字符串的最大公共(public)连接子串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70553816/

相关文章:

algorithm - Clojure 字符串用文本替换 map 向量

algorithm - 使用不相交集数据结构,图论

c++ - 从一组集合中找到集合子集的最佳方法

java - 我如何在不出现 OutOfMemoryError 的情况下存储 10,000 x 10,000 的二维数组?

java - 一种递归求解邮票问题的算法

javascript - 数组元素不拼接成单独的数组 - FreeCodeCamp > Chunky Monkey

algorithm - 贪心算法,调度

algorithm - 我可以将哪些启发式函数用于基于图(非网格)的 A*?

arrays - 如何在不对数组进行排序的情况下在未排序的数组中找到第 k 个最小整数?

algorithm - 对于快速稳定的指针数组排序,哪种算法是正确的?