我试图独立地推导出LCS问题的动态编程解决方案。
考虑以下两个字符串:
Q=BAT
P=ABACD
让我们首先注意LCS仍然与我们沿其中一个字符串滑动相同。也就是说,很容易看出
LCS(BAT,ABAC)= LCS(BAT,ABACD)
这让我觉得我们可以根据在第二个字符串的每个字符上滑动的单个指针构建最佳解决方案。
也就是说,我们建立了如下的子解决方案:
也就是说,我们想要滑过字符串P.
from collections import defaultdict
def LCS(Q, P):
subsolution_table = defaultdict(lambda: "")
for i in xrange(len(P)):
last_solution_with_char = LCS(Q, P[:i - 1]) + P[i]
if is_subsequence(last_solution_with_char, Q):
return last_solution_with_char
else:
# Reuse last solution
return LCS(Q, P[:i - 1])
我被困在这里。我不知道如何找到LCS问题的实际解决方案。由于线性扫描和is_subsequence
检查,这实际上是一个O(N ^ 2)解决方案。
但我不确定如何从我目前的逻辑中找到正确的次优解决方案。
对此的任何建议都会很棒。