【发布时间】:2018-07-17 00:57:32
【问题描述】:
我试图找到两个字符串之间最长的公共子序列。
我看了这个教程https://www.youtube.com/watch?v=NnD96abizww
并写道:
# Longest Common Subsequence
def lcs(s1, s2):
matrix = [ [0 for x in range(len(s2))] for x in range(len(s1)) ]
cs = ""
for i in range(len(s1)):
for j in range(len(s2)):
if s1[i]==s2[j]:
if i==0 or j==0:
matrix[i][j] = 1
cs += s1[i]
else:
matrix[i][j] = matrix[i-1][j-1] + 1
cs += s1[i]
else:
if i==0 or j==0:
matrix[i][j] = 0
else:
matrix[i][j] = max(matrix[i-1][j], matrix[i][j-1])
return matrix[len(s1)-1][len(s2)-1], cs
print(lcs("abcdaf", "acbcf"))
I get (3, 'abccaf')
这显然是错误的,应该是 4 abcf。
不确定哪一步出了问题。一个普遍的问题是程序员通常需要多长时间才能“得到”这类问题?
【问题讨论】:
-
尝试更仔细地遵循这里的伪代码:en.wikipedia.org/wiki/Longest_common_subsequence_problem 我认为问题可能与没有将矩阵的零索引保留为零来表示空交集有关。您可能还想研究那里关于回溯的解释。
标签: python algorithm dynamic-programming