一尘不染

3个以上字符串的最长公共子序列

algorithm

我试图找到3个或更多字符串的最长公共子序列。Wikipedia文章对如何对2个字符串执行此操作进行了很好的描述,但是我不确定如何将其扩展到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”。


阅读 469

收藏
2020-07-28

共1个答案

一尘不染

只需概括一下递归关系即可。

对于三个字符串:

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

应该很容易由此概括为更多的字符串。

2020-07-28