python - 3个以上字符串的最长公共(public)子序列

标签 python algorithm dynamic-programming lcs

我试图找到 3 个或更多字符串的最长公共(public)子序列。维基百科文章对 how to do this for 2 strings 有很好的描述,但我有点不确定如何将其扩展到 3 个或更多字符串。

有很多库可用于查找 2 个字符串的 LCS,因此如果可能,我想使用其中一个。如果我有 3 个字符串 A、B 和 C,找到 A 和 B 的 LCS 作为 X,然后找到 X 和 C 的 LCS 是否有效,或者这是错误的方法吗?

我在 Python 中实现如下:

import difflib

def lcs(str1, str2):
    sm = difflib.SequenceMatcher()
    sm.set_seqs(str1, str2)
    matching_blocks = [str1[m.a:m.a+m.size] for m in sm.get_matching_blocks()]
    return "".join(matching_blocks)

print reduce(lcs, ['abacbdab', 'bdcaba', 'cbacaa'])

这会输出“ba”,但它应该是“baa”。

最佳答案

只是概括递归关系。

对于三个字符串:

dp[i, j, k] = 1 + dp[i - 1, j - 1, k - 1] if A[i] = B[j] = C[k]
              max(dp[i - 1, j, k], dp[i, j - 1, k], dp[i, j, k - 1]) otherwise

应该很容易从中推广到更多字符串。

关于python - 3个以上字符串的最长公共(public)子序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5057243/

相关文章:

algorithm - 计算给定路径成本下的最大利润

python - 通过参数确定绘图平滑度

c++ - 在笛卡尔坐标和屏幕坐标之间转换

dynamic-programming - 了解策略和值(value)函数强化学习

计算可被 k 整除的 m 元素集的 n 元素子集的算法

algorithm - 结合 PRNG 和 'true' 随机,快速和(也许)愚蠢的方式

python - 找到字母(列表)的第 n 个组合(增量方法)

python - 构建启用时区的应用程序时的最佳实践

python - Pandas 有条件地复制单元格值

python - 如何重写 Django 的信号处理程序?