【发布时间】:2020-04-18 14:37:21
【问题描述】:
我正在尝试解决在两个字符串之间找到最长公共序列的问题。我使用了动态编程(DP)并尝试对其进行优化。但是我仍然在 HackerRank 上遇到超时,我不知道为什么。我使用 Hunt-Szymanski 算法的迭代版本。
我没有使用一个矩阵,而是只使用了两行并将它们互换。我还消除了字符串开头和结尾的所有常见字符。我还使用了算法的迭代版本。我还能如何优化它?
这是我的代码:
def commonChild(s1, s2):
nr = 0
while s1[0]==s2[0]:
nr+=1
s1=s1[1::]
s2=s2[1::]
while s1[-1]==s2[-1]:
nr+=1
s1=s1[0:-1]
s2=s2[0:-1]
row1 = [0]*(len(s1)+1)
row2 = [0]*(len(s1)+1)
for i in range(1,len(s1)+1):
for j in range(1,len(s2)+1):
if s1[j-1]==s2[i-1]:
row2[j]=row1[j-1]+1
else:
row2[j]=max(row2[j-1], row1[j])
row1=row2
row2=[0]*(len(s1)+1)
return row1[-1]+nr
谢谢。
【问题讨论】:
-
您能否将您的问题扩展为minimal reproducible example?还有,什么是“DP”?
-
@Alex DP 是动态编程。当然,首先我消除了所有相同的第一个和最后一个元素,在 nr 中保留这些元素的数量。之后,我使用en.wikipedia.org/wiki/Hunt%E2%80%93Szymanski_algorithm 这个算法的迭代版本,而不是使用矩阵,我只使用我交换的两行(row1 和 row2)。我保留相同元素的数量,最后添加我计算的 nr 和开头
-
您应该使用这些详细信息更新您的问题。将 cmets 添加到代码中并提供示例输入和相应的输出。那是minimal reproducible example。
-
您确定问题是超时吗?我注意到您的实现中有几个错误。
标签: python algorithm optimization dynamic-programming longest-substring